[英]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之间是否存在一些技术差异,或者这仅仅是命名约定?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.