我最近一直在研究逆向工程,想了解更多关于ASM的知识。因此我查阅了一些教程,但发现了一些关于dx寄存器的令人困惑的信息。
我在这里写了一个小的“Hello World”示例:
section .text
global _start
_start:
mov edx, mes_len ; Store where the bytes end for the data in the data register
mov ecx, message ; Store the reference to the message that we're going to write in the counter register
mov ebx, 1 ; Tell tha base register that we want to push to the stdout
mov eax, 4 ; Move 4 into the Accumulator which is the equivalent of calling sys write on linux
int 0x80 ; int means interrupt, 0x80 means interrupt the kernel to make our system calls
mov eax, 1 ; Move 1 into accumulator, which is sys exit on linux
mov ebx, 0 ; exit code 0
int 0x80
section .data
message: db "Hello, World", 10, 0 ; 10 is the newline character and 0 is the null character
mes_len: equ $ - message ; "$" means current position, then we subtract that from the length of our message
和线
mov edx, mes_len ; Store where the bytes end for the data in the data register
根据this source,edx与Accumulator一起用于复杂的计算,如除法或乘法,但也用于I/O。然后它声明数据寄存器保存消息的地址,但累加器不也保存消息的地址吗?
任何帮助将不胜感激。
1条答案
按热度按时间e4eetjau1#
英特尔寄存器是通用寄存器。由于历史/遗留原因,其中一些与特定角色相关联,但随着英特尔CPU几十年来的发展,这种情况越来越少。某些特殊用途仍然存在,例如使用
CX
/ECX
作为循环计数器,使用DX
/EDX
作为累加器的扩展,使用DX
/EDX
作为累加器的扩展,使用CX
/EDX
作为累加器的扩展,使用CX
/ECX
作为循环计数器。等等中断是完全不同的事情:它们本质上是函数调用。因此,实现中断的任何人(在您的情况下,内核)都可以自由定义每个寄存器在调用中断时应该包含的内容,以及每个寄存器在中断返回时应该包含的内容。因此,他们可以随心所欲地为寄存器分配角色,并且这些角色不一定与寄存器的历史角色有任何关系。
在你链接到的文本中,我找不到任何
EAX
或EDX
用于包含地址的引用。可能没有CPU指令需要EDX
包含内存地址,(ESI
和EDI
通常履行这样的角色),但中断绝对可以自由要求EDX
包含内存地址。