我正试图从头开始学习装配。我已经阅读了很多,但即使是我在参考书中找到的以下简单程序也让我难过:
section .data
msg db "Hello!", 0xa
len equ $ - msg
section .text
global _start
_start:
move edx, len
move ecx, msg
move ebx, 1
move eax, 4
int 0x80
move ebx, 0
move eax, 1
int 0x80
现在显然这应该打印“你好”。 但我甚至不知道在任何阶段都会发生什么。 前两个阶段将消息长度和messgae放在两个寄存器中,这些寄存器从未再次使用过。我不明白为什么。
我不知道为什么需要四个不同的寄存器。
答案 0 :(得分:3)
int 80
是一些用于进行系统调用的 * a 类UNIX操作系统的机制。
对于这些调用,寄存器用于特定值。来自syscalls
文件:
0 STD NOHIDE { int nosys(void); } syscall nosys_args int
1 STD NOHIDE { void exit(int rval); } exit rexit_args void
2 STD POSIX { int fork(void); }
3 STD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
4 STD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
您可以看到号码4是write
号码,需要其他三个参数。数字1是exit
,只需要返回代码。
拨打电话时,eax
是您正在进行的系统调用,而ebx
,ecx
和edx
是三个参数(假设他们都需要) - exit
例如只需要一个。)
因此,您可以按如下方式对代码进行注释:
move edx, len ; length of message (nbyte).
move ecx, msg ; message to print (buf).
move ebx, 1 ; file handle 1, stdout (fd).
move eax, 4 ; write syscall.
int 0x80 ; do it.
move ebx, 0 ; exit code (rval).
move eax, 1 ; exit syscall.
int 0x80 ; do it.
* a: Linux的后续版本引入了一个新界面,可以使用不同的方法提供最佳速度。例如,如果您使用sysenter
而不是int 80
,则某些英特尔芯片会快得多。
答案 1 :(得分:1)
IIRC int 0x80
指令用于通过使用中断向量来调用系统调用。在您的示例中,ebx
和eax
中的值用于指定您要调用的系统调用(可能是stdout上的打印操作)。
系统调用通过召集知道edx
和ecx
应该包含要打印的内容。
答案 2 :(得分:1)
在许多系统上,int 80h是system call门。系统调用号码位于eax
。 ebx
,ecx
和edx
包含其他参数:
move edx, len
move ecx, msg
move ebx, 1 ; fd 1 is stdout
move eax, 4 ; syscall 4 is write
int 0x80 ; write(1, msg, len)
move ebx, 0
move eax, 1 ; syscall 1 is exit
int 0x80 ; exit(0)
答案 3 :(得分:0)
当您调用系统调用'int'助记符时,会生成系统中断。它有点“跳转”到系统函数,在这种情况下,打印输出(取决于eax)。
这次中断使用所有这些寄存器来知道该怎么做。中断读取eax,检查您想要的功能,并使用其他寄存器来执行此操作。
eax是函数编号,4表示sys_write,它将字符串写入流/文件描述符。
现在它知道你想要把东西写到某个地方,然后它会使用其他寄存器来处理那些信息。
对于eax = 4和int 0x80这是其他寄存器的含义:
ebx =输出(1 =标准输出)
ecx =字符串的地址
edx =字符串的长度
您可以阅读:
http://www.intel.com/Assets/ja_JP/PDF/manual/253665.pdf
第6.4节 它有一些关于Interruptins和Exceptions的东西。
你可以开始编写英特尔80x86汇编代码,这个代码更简单易懂,下面是一些链接:
助记符/代码表备忘单: http://www.jegerlehner.ch/intel/
一些介绍网站: http://mysite.du.edu/~etuttle/math/8086.htm http://www.malware.org/teaching/assembly.htm