数据寄存器在汇编(linux,32位,nasm)中是如何工作的?

rsaldnfx  于 2023-04-11  发布在  Linux
关注(0)|答案(1)|浏览(116)

我最近一直在研究逆向工程,想了解更多关于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。然后它声明数据寄存器保存消息的地址,但累加器不也保存消息的地址吗?
任何帮助将不胜感激。

e4eetjau

e4eetjau1#

英特尔寄存器是通用寄存器。由于历史/遗留原因,其中一些与特定角色相关联,但随着英特尔CPU几十年来的发展,这种情况越来越少。某些特殊用途仍然存在,例如使用CX/ECX作为循环计数器,使用DX/EDX作为累加器的扩展,使用DX/EDX作为累加器的扩展,使用CX/EDX作为累加器的扩展,使用CX/ECX作为循环计数器。等等
中断是完全不同的事情:它们本质上是函数调用。因此,实现中断的任何人(在您的情况下,内核)都可以自由定义每个寄存器在调用中断时应该包含的内容,以及每个寄存器在中断返回时应该包含的内容。因此,他们可以随心所欲地为寄存器分配角色,并且这些角色不一定与寄存器的历史角色有任何关系。
在你链接到的文本中,我找不到任何EAXEDX用于包含地址的引用。可能没有CPU指令需要EDX包含内存地址,(ESIEDI通常履行这样的角色),但中断绝对可以自由要求EDX包含内存地址。

相关问题