【问题标题】:registers and interrupts in assembly汇编中的寄存器和中断
【发布时间】:2013-07-26 17:11:36
【问题描述】:

我正在阅读有关 Linux 中 nasm 编程的手册,但有一件事我找不到答案。

考虑以下代码:

mov eax, 4
mov ebx, 1
mov ecx, buffer
int 0x80

据我了解,这会将设置设置为适当的寄存器,然后“推动”它们执行。 我的问题是为什么 eax 会存储系统调用,而不是 ebx? 为什么 ecx 存储我们想要在屏幕上打印的东西? eax 和 ebx 之间是否存在一些技术差异,或者这只是一个命名约定?如果是,“寄存器名-函数”表存放在哪里?

谢谢

【问题讨论】:

    标签: assembly nasm


    【解决方案1】:

    这是系统特定的事情,因此您必须阅读操作系统的手册。你描述的看起来像一个Linux系统调用。那些是well documented。软件中断本身对寄存器没有语义,但操作系统会告诉您它期望在各种寄存器和堆栈中的数据以及它如何传达结果。

    【讨论】:

      【解决方案2】:

      这是你的程序所做的:

      ; print a byte to stdout
      mov eax, 4           ; the system interprets 4 as "write"
      mov ebx, 1           ; standard output (print to terminal)
      mov ecx, buffer      ; pointer to the value being passed
      mov edx, 1           ; size of the buffer
      int 0x80             ; call the kernel
      

      认为它是系统特定的......

      就像下面的linux系统调用文档中所说的那样,sys_call号码存储在eax中。

      我建议看看这个非常好的文档:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

      系统调用的数量将被放入寄存器eax。在调用软件中断int 0x80 之前,将其他值放入剩余的寄存器中。每次系统调用后,eax 中都会返回一个整数。

      具体回答:

      我的问题是为什么 eax 会存储系统调用,而不是 ebx?

      它是系统特定的。系统定义它应该是这样的,所以它是。

      为什么 ecx 会在屏幕上存储我们想要打印的内容?

      同样的事情......

      eax 和 ebx 之间是否存在一些技术差异,或者这只是一种命名约定?

      • EAX - 累加器寄存器
      • EBX - 基址寄存器
      • ECX - 计数器寄存器
      • EDX - 数据寄存器
      • ESI - 来源索引
      • EDI - 目的地索引
      • EBP - 基指针
      • ESP - 堆栈指针

      来源:http://www.swansontec.com/sregisters.html

      【讨论】:

      • >例如,对于 linux,您将 sys_call 号码存储在 eax 中。好的,问题是我们为什么将它存储在那里以及记录在哪里。我认为这是非常重要的事情,它包含在一些官方文件中。
      • 现在这就是我想要的。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2021-03-25
      • 2012-01-11
      • 2014-04-25
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多