以下行是什么意思:
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
Run Code Online (Sandbox Code Playgroud)
内存地址前面的星号是什么意思?此外,当内存访问方法缺少它的第一个寄存器值时,它意味着什么?
通常它的类似("%register",%rax,8),但在这种情况下它没有第一个寄存器.
有小费吗?
我试图掌握MASM32,并对以下内容感到困惑:
我认为括号用于间接,所以如果我有一个预定义的变量
.data
item dd 42
Run Code Online (Sandbox Code Playgroud)
然后
mov ebx, item
Run Code Online (Sandbox Code Playgroud)
将'item'的内容,即数字42,放入ebx和
mov ebx, [item]
Run Code Online (Sandbox Code Playgroud)
将'item'的地址,即存储42的地址放入ebx.
但是控制台应用程序中的以下代码:
mov ebx, item
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
mov ebx, [item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)
两次打印42次.要获得"项目"的地址,我似乎需要
mov ebx, [OFFSET item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释MASM中的方括号,或者指出一个很好的参考.
x86 汇编设计有指令后缀,如l(long)
, w(word)
, b(byte)
。
所以我认为这jmpl
是long jmp
但是当我编译它时它的工作很奇怪。
见下面的例子。
测试1:组装
main:
jmp main
Run Code Online (Sandbox Code Playgroud)
测试1:编译结果
eb fe jmp 0x0804839b <main>
Run Code Online (Sandbox Code Playgroud)
测试2:组装
main:
jmpl main # added l suffix
Run Code Online (Sandbox Code Playgroud)
测试2:编译结果
ff 25 9b 83 04 08 jmp *0x0804839b
Run Code Online (Sandbox Code Playgroud)
与Test1相比,Test2的结果出乎意料。
我认为它应该与Test1一样编译。
问:
是jmpl
什么不同的指令在8086的设计?
(根据这里,jmpl
在 SPARK 中意味着 jmp 链接。是这样的吗?)
...或者这只是 gnu 汇编程序上的错误?