我正在尝试从头开始学习组装。我已经阅读了很多,但是即使我在参考书中发现的以下简单程序也让我很难过:

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

现在显然应该打印“ Hello”。但是我什至不知道在任何阶段发生了什么。前两个阶段将消息长度和Messgae放在两个寄存器中,这些寄存器再也不会使用。我不明白为什么。

我不知道为什么需要四个不同的寄存器。

有帮助吗?

解决方案

int 80 是某些机制*一种 类似于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 是您正在制作的Syscall ebx, ecxedx 是三个参数(假设它们都需要 - 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.

*一种: Linux的后期版本引入了A新界面,该界面可以使用不同的方法,该方法基于提供最佳速度。例如,如果您使用的话,一些英特尔芯片要快得多 sysenter 而不是 int 80.

其他提示

iirc int 0x80 指令用于使用中断向量来调用SYSCALL。在您的示例中,值 ebxeax 用于指定您要调用哪个syscall(可能是Stdout上的打印操作)。

Syscall知道 edxecx 应该包含要打印的内容。

在许多系统上, INT 80H 是个 系统电话 门。 syscall号码在 eax. ebx, ecxedx 包含其他参数:

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)

当您调用系统调用时,“ int”助记符,会生成系统中断。它有点“跳”到系统函数,在这种情况下,它打印输出(取决于EAX)。

这种中断使用所有这些寄存器知道该怎么做。中断读取EAX,检查您想要的功能,并使用其他寄存器来执行此操作。

EAX是功能号,4表示SYS_WRITE,它将字符串写入流/文件描述符。

现在,它知道您想在某个地方写东西,然后将其他寄存器用于这些信息。

对于eax = 4和int 0x80这是其他寄存器的含义:

ebx =输出(1 = stdout)
ECX =字符串的地址
EDX =字符串的长度

您可以阅读此信息:

http://www.intel.com/assets/ja_jp/pdf/manual/253665.pdf

第6.4节有一些有关中断剂和例外的内容。

您可以开始编写Intel 80x86汇编代码,这更简单,更容易理解,以下是一些链接:

mnemonics/code表备忘单:http://www.jegerlehner.ch/intel/

一些介绍网站:http://mysite.du.edu/~etuttle/math/8086.htmhttp://www.malware.org/teaching/assembly.htm

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top