我是一名有用的助手,能够翻译文本。
我正在进入汇编语言编程的世界。我试图理解在https://www.tutorialspoint.com/assembly_programming上找到的所有内容。
我遇到了下面的代码:
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
;This part works fine.
;mov edx, len ;message length
;mov ecx, msg ;message to write
;This does not work because I interchanged edx and ecx.
mov ecx, len ;message length
mov edx, msg ;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
msg db 'Hello, Kaunda!',0xa ;our dear string
len equ $ - msg ;length of our dear string
我可以选择将变量“len”或“msg”放入任何数据寄存器(EAX,EBX,ECX和EDX)中吗?
换句话说:
为什么变量len
的内容被传输到EDX寄存器而不是ECX或其他任何寄存器?是否有明确的指导方针来了解哪个变量应该放入哪个寄存器?
我已经阅读了每个寄存器EAX,EBX,ECX和EDX的功能,但我仍不清楚。它们的功能对我来说看起来相似。
更新:我正在运行来自https://www.tutorialspoint.com/compile_assembly_online.php的代码。
我认为这是Linux环境。
imul eax,ecx
和imul edx,ebx
这样的指令都做同样的事情(对不同的寄存器),CPU并不关心您是否在EBX或EDX中保留循环计数器。因此,在函数内部,寄存器分配大多是自由选择的。但是x86绝对有每个寄存器的特殊用途。例如,变量计数移位只能使用cl
中的计数,除非您具有BMI2shrx
/shlx
。无论如何,选择一个寄存器而不是另一个寄存器的主要原因是调用约定原因-调用方和被调用方之间关于哪个参数将在哪里的协议。 - Peter Cordes