繁体   English   中英

汇编中的寄存器和中断

[英]registers and interrupts in assembly

我正在阅读有关Linux上的nasm编程的手册,但有一个我找不到答案的东西。

考虑以下代码:

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

据我了解,这会将设置设置为适当的寄存器,然后将其“推送”到执行。 我的问题是,为什么eax会存储syscall,而不是ebx? 为什么ecx将我们要打印的内容存储在屏幕上? eax和ebx之间是否存在一些技术差异,或者这仅仅是命名约定? 如果是,表“寄存器名称-功能”存储在哪里?

谢谢

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

这是您的程序执行的操作:

; 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会存储syscall,而不是ebx?

它是系统特定的。 系统定义它应该像这样。

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

一样...

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM