我对汇编编程很新.我正在使用x86平台和GCC(Linux).
我有一个函数,我想从C调用:
myfunc ( unsigned char * s1, unsigned char * s2, int someint );
Run Code Online (Sandbox Code Playgroud)
该函数将获取s1和s2存储器位置并进行比较,然后递增和比较等,进行一些处理.这有点像memcmp,但我做得更多.
我的问题:如果我将指针传递给汇编函数?然后我怎么说"给我存储在这个内存地址的值"?
这是我到目前为止所拥有的:
要从堆栈中获取第一个函数arg("s1"),我这样做(someaddress是一个32位整数,我正在使用一个32位处理器):
movl 8(%esp), %ecx
movl %ecx, someaddress
Run Code Online (Sandbox Code Playgroud)
如果我把somevar成%eax(或%ebx等等),然后printf的它%p,我看到它的地址和无符号的字符指针"的地址,s1"我通过这都是一样的.但我怀疑我实际做的是获取内存地址,将其转换为整数,然后将该整数放入某个地址.
例如,如果我这样做:
movl pos1, %eax
movl pos2, %ebx
cmp (%eax),(%ebx)
Run Code Online (Sandbox Code Playgroud)
我得到"错误:'cmp'的内存引用太多了".我不完全确定这意味着什么,除了"你搞砸了";-)
所以...
*ptr在C中)我想查看LEA操作数吗?
我正在使用Richard Blum的"专业装配编程"作为我的向导,但Blum似乎并没有涵盖这种情况.
更新
非常感谢您的学习回应!
不幸的是,我仍然无法解除引用.
这是一个简化的例子.汇编函数接受指针并应该回显它.相反,我得到:
first_ptr points to 81 (should be 81) <-- from C program
the value is -1543299247 <-- printf called from within assembler
the …Run Code Online (Sandbox Code Playgroud) 这个结构在perl中很常见:
opendir (B,"/somedir") or die "couldn't open dir!";
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用:
opendir ( B, "/does-not-exist " ) or {
print "sorry, that directory doesn't exist.\n";
print "now I eat fugu.\n";
exit 1;
};
Run Code Online (Sandbox Code Playgroud)
"或"错误处理是否有可能有多个命令?
编译以上内容:
# perl -c test.pl
syntax error at test.pl line 5, near "print"
syntax error at test.pl line 7, near "}"
test.pl had compilation errors.
Run Code Online (Sandbox Code Playgroud) 我在Microsoft的Azure中创建了一个Small Linux VM.我还创建了一个20GB的BLOB并将其作为文件系统安装.
在我的VM上,我看到以下内容:
所以我有疑问:
(1)如果我关闭VM然后再打开电源,这些文件系统/卷中的哪一个将在VM断电时保持状态?每个卷(我测试过)都是如此,但"它在测试中工作"与保证不同.
(2)如果VM需要移动,因为Azure环境中存在某种硬件故障或故障("自我修复迁移"),那些文件系统中哪些会持续存在?我怀疑root会,但不是/ mnt/resource?
(3)在azure管理门户中,我创建了一个30GB的磁盘,这个磁盘是在创建VM时创建的.该磁盘的成本是每小时每分钟VM费用的一部分,还是单独收费?我认为这是分开的.
(4)据说一个小型虚拟机配备165GB用于"虚拟机角色中的本地存储资源的磁盘空间":http://msdn.microsoft.com/en-us/library/windowsazure/ee814754.aspx 我看到69GB - 其中剩下的去哪?
您认为我可以向微软询问这些问题,但是当我这样做时,他们说Linux虚拟机处于"预览"状态,并且他们的支持拒绝回答任何Linux VM问题,除非指向相当幽灵般的Azure论坛.
Azure VM 表...
https://www.windowsazure.com/en-us/pricing/details/#header-2
...说,例如,中型实例带有 490GB 的本地存储。所以我期待通常的 30GB Azure BLOB OS 磁盘,然后是 490GB /mnt/resource。
但不是:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
28G 1.7G 25G 7% /
tmpfs 1.7G 0 1.7G 0% /dev/shm
/dev/sda1 485M 68M 392M 15% /boot
/dev/sdb1 133G 188M 126G 1% /mnt/resource
Run Code Online (Sandbox Code Playgroud)
这是在 CentOS 映像上,但对于其他映像也是如此。
我错过了什么吗?我看不到卷组中的空间或任何东西,也没有未安装的 sd* 设备。
使用Safari,如果我将其设置为打开新选项卡为空白,当我点击cmd-T时,我的光标位于地址栏中,准备输入URL或搜索.
如果我将其设置为转到主页,则光标不会立即转到地址栏,我必须按击键.
我可以在我的主页上放置一个Javascript(我是唯一使用它的人 - 通常的"书签"页面),这样当我访问该页面时,我的焦点(光标)会自动进入浏览器的地址栏吗?
我可以添加一个搜索框,但有时我想直接输入一个URL.
假设我有这个:
type Donut string
type Muffin string
func getPastry () (interface{}, error) {
// some logic - this is contrived
var d Donut
d = "Bavarian"
return d, nil
}
Run Code Online (Sandbox Code Playgroud)
是否可以将其减少到一行:
p, err := getPastry()
thisPastry := p.(Donut)
Run Code Online (Sandbox Code Playgroud)
换句话说,这样的东西,不编译:
thisPastry, err := getPastry().(Donut, error)
Run Code Online (Sandbox Code Playgroud)
不是有两行代码来获得"通用"并输入它是一件大事,但它对我来说只是感觉浪费和不简单,这通常意味着我错过了一些明显的东西:-)
我正在将一个FOSS包移植到HP-UX.我有一个编译器警告,我无法弄清楚.我应该注意到我正在使用HP-UX捆绑的免费/ usr/bin/cc,而不是附加购买的编译器,以使包尽可能广泛使用.
编译(只是没有标志的cc)说:
Warning 942: "grep.c", line 288 # Types 'char *' and 'int' are not assignment-compatible.
if ((fname = strsep(&lp, ":")) == NULL)
^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
声明该函数中的fname:
char *fname, *line, *lp, *ln;
Run Code Online (Sandbox Code Playgroud)
所以fname是一个char ptr.这就是strsep()返回的内容:
char *strsep(char **stringp, const char *delim) {
Run Code Online (Sandbox Code Playgroud)
strsep包含在OpenBSD中:http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/string/strsep.c? rev = 1.6; content-type = text%2Fplain
所以...... strsep返回一个char指针,这就是fname.strsep只能返回一个字符指针或NULL.那么所有这些中的'int'在哪里?
假设我有一个像这样的CSS:
p {
color: #000000;
}
p.myclass {
color: #ff0000;
}
Run Code Online (Sandbox Code Playgroud)
所以所有段落文本都应该是黑色的,除了"myclass"段落,它们是红色的.
我看到的是,如果我这样做:
<div class="myclass">
<p>Something something something</p>
</div>
Run Code Online (Sandbox Code Playgroud)
我还是变黑了.如果我这样做:
<p class="myclass">Something something something</p>
Run Code Online (Sandbox Code Playgroud)
然后我变红了.
在真实世界的页面上,我有多个部分要我应用不同的类,所以我不能只在页面级别定义'p'.但是每个人都是等级=
标签看起来真的很低效.
难道没有办法说"在这个块中,使用这个类,然后任何
该块中的标签是否与该类匹配?我认为这就是div所做的.
我确信有一些基本的我误解了......
我有一个接收 JSON 消息的应用程序。JSON 有各种“部分”(下面的示例)。每个部分都有一个名称,但除此之外的结构每个部分都完全不同。
我想要做的是遍历各个部分,并将每个部分解组到适当的对象中。但奇怪的是,我发现这很困难,因为您似乎可以将整个 JSON 解组为一个对象,或者您可以获得一个通用的 map[string]interface{}。我发现的所有示例代码都涉及类型切换和手动分配变量……我希望将neato Unmarshal 直接执行到对象中。
有没有办法提供解组 JSON 的子集?我可以自己对字节 [] 进行切片和切块,但这似乎很可怕……其他人肯定也经历过这样的事情吗?
这是我玩过的。
package main
import "encoding/json"
type Book struct {
Author string
Title string
Price float64
}
type Movie struct {
Title string
Year float64
Stars float64
Format string
}
var sections map[string]interface{}
func main() {
/*
* "Book" and "Movie" are "sections".
* There are dozens of possible section types,
* and which are present is not known ahead of time
*/
incoming_msg_string := ` …Run Code Online (Sandbox Code Playgroud) 此代码不起作用。它抱怨j.Bar是一个“非名称”:
package main
import "fmt"
import "os"
type foo struct {
Bar string
Baz int
}
func main() {
var j foo
// this next line fails with "non-name j.Bar on left side of :="
j.Bar, ok := os.LookupEnv("SOME VAR")
if ( ! ok ) {
panic("lookup failed!")
}
fmt.Printf("j.Bar is now %s\n",j.Bar)
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以轻松更改它以使其正常工作:
package main
import "fmt"
import "os"
type foo struct {
Bar string
Baz int
}
func main() {
var j foo
val, ok := os.LookupEnv("SOME …Run Code Online (Sandbox Code Playgroud) 简而言之,当我在macOS High Sierra上使用DBD :: SQLite时,我得到了大量虚假的"子程序...重新定义"错误.
如果我使用此代码并在我的iMac或MacBook Pro上运行(均运行10.13.3 High Sierra)...
#!/usr/bin/perl -w
use DBI;
use DBD::sqlite;
$db_file = "./anything.db";
$dbh = DBI->connect("dbi:SQLite:dbname=$db_file","","");
$dbh->disconnect();
Run Code Online (Sandbox Code Playgroud)
它产生了这个:
Constant subroutine DBD::SQLite::NEWAPI redefined at /System/Library/Perl/5.18/constant.pm line 140.
Subroutine driver redefined at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/DBD/SQLite.pm line 31.
Subroutine CLONE redefined at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/DBD/SQLite.pm line 73.
Subroutine connect redefined at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/DBD/SQLite.pm line 80.
Subroutine install_collation redefined at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/DBD/SQLite.pm line 160.
Subroutine regexp redefined at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/DBD/SQLite.pm line 178.
Subroutine prepare redefined at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/DBD/SQLite.pm line 186.
Subroutine do redefined at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/DBD/SQLite.pm line 200. …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的课程:
class MyHash : IComparable
{
public byte[] myBytes = new byte[15];
// constructor
MyHash(byte[] incomingByteArray)
{
for (int i = 0; i <= 15; i++)
{
myBytes[i] = incomingByteArray[i];
}
}
// other irrelevant stuff here
}
Run Code Online (Sandbox Code Playgroud)
现在稍后当我想使用这个类时,我尝试:
MD5 hashMaker = MD5.Create();
byte[] hash = hashMaker.ComputeHash(Encoding.UTF8.GetBytes(thisSubstring));
listOfHashes.Add(new MyHash(hash));
Run Code Online (Sandbox Code Playgroud)
...和Visual Studio(2013)抱怨MyHash"不包含带有1个参数的构造函数".
所以说起来作为ac#novice和可能误用单词来启动,我认为MyHash构造函数正在获得对'hash'的单一引用,它期待的是一个数组......?
我可以破解这个有15个参数的构造函数并实例化它(新的MyHash(hash [0],hash [1]等))但这似乎是错误的事情,我担心我会付钱给它在生活中的程序员.我可以将byte []转换为ArrayList或者其他东西,但是当你在该循环中运行数百万次时会增加相当大的开销.
我也没有看到在构造函数中指定特定数组长度的方法(例如,bytes [15]).
那么将一个字节数组(byte [])发送给构造函数的Correct和True方法是什么?
非常感谢!