关于组装的新手问题

时间:2018-11-20 15:08:17

标签: assembly

关于ASM的某些事情,我无法解决:

例如,在那个简单的“ hello world”中:

section .data
msg   db   "hello world" , 0x0A
section .text
global _start
_start:
mov ecx , msg ;here we store the string
mov edx , 13  ;here we store the length of the string
mov ebx , 1   ;but what is this ? 
mov eax , 4   ;and this ? 
int 0x80

我在asmtutor.com上举了这个例子,在这两行中,他们写道:

mov ebx , 1 ; write to STDOUT
mov eax , 4 ; kernel opcode for SYS_WRITE

我真正不了解的是为什么每个寄存器都有特定的值来提供一些系统功能...

我的意思是,如果您正在编写汇编代码,则可能最终会为自己的应用程序将值4存储在eax中,例如,您要计算所拥有的书本数量,放置4本书,将其存储在eax中...那么如何区分操作码和用户值? 如果我不得不猜测,我会说:

int 0x80 

就是在做魔术,所以当您遇到中断时,它会读取一些寄存器的值以查看是否有一些操作码...但是我不确定。

就像我在标题上写的一样,我只是发现ASM,但我通常使用更高的语言级别进行编码,例如C语言。

现在,我正在x86平台上尝试NASM,如果可以的话。

现在,第二个问题。

以前的代码是段错误的,我们必须添加:

mov ebx , 0 ; return 0 status
mov eax , 1 ; invoke SYS_EXIT
int 0x80

我们为什么要这样做?

此后没有段错误,为什么?

是因为我们添加了返回值0还是存在SYS_EXIT?

我会在这里猜测,如果没有SYS_EXIT,处理器将继续读取ram上的其他指令,因此会出现segfault。

仍然是我的主要问题,如何使用这些操作码以及它们如何工作?

是因为中断吗?

1 个答案:

答案 0 :(得分:2)

int 0x80是用于32位系统的Linux系统调用接口-一种调用内核提供的功能的方法。

Linux系统调用接口希望参数在CPU寄存器中传递。

下面的代码摘录以退出代码0终止当前进程-有关寄存器的用法,请参见Linux Syscall Reference

mov ebx , 0 ; return 0 status
mov eax , 1 ; invoke SYS_EXIT
int 0x80