我不能为我的生活理解为什么下面的IA-32汇编代码有效。我将通过在下面逐行浏览代码来解释我不理解的部分。
section .text
global main
main:
mov ecx, len
mov esi, s1
mov edi, s2
cld
rep movsb
mov edx,20 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
s1 db 'Hello, world!', 0
len equ $-s1
section .bss
s2 resb 20
首先,将ecx设置为字符串的长度,以便rep对字符串中的所有字符重复movsb。接下来,将esi设置为等于字符串,并将edi设置为20个字节。接下来,我们清除方向标志,以便movsb在正确的方向上复制。最后,我们得到movsb助记符,它将字符从esi中指定的内存地址移动到edi中指定的内存地址。对于字符串中的每个字符重复这一过程。
我遇到的问题是,如果你看一下esi和edi,它们不会被设置为s1和s2的地址。它们被设置为s1和s2的值。如果我们想将寄存器设置为地址,我想我们必须使用“mov esi,[s1]”和“mov edi,[s2]”。然而,这不是代码所说的。代码是从教程到汇编编程,所以应该是正确的。
非常感谢帮助我深究这一点。
马格努斯
答案 0 :(得分:3)
我遇到的问题是,如果你看一下esi和edi,它们不会被设置为s1和s2的地址。它们被设置为s1和s2的值。如果我们想将寄存器设置为地址,我想我们必须使用" mov esi,[s1]"和" mov edi,[s2]"。
你已经倒退了。
您mov esi,foo
用于将foo
的地址放入esi
mov esi,[foo]
,foo
是用于将值放在esi
上的mov esi,OFFSET foo
mov esi,foo
的地址mov esi,[foo]
。
请注意,不同汇编程序的语法不同。我上面所说的对于NASM来说是正确的(这是你已经表明你正在使用的),但是当你使用MASM / TASM时,你使用{{1}}获取地址,而{{1}}和{{1}}都会获得价值。