簡體   English   中英

簡單程序的組裝問題

[英]Assembly problem with simple program

我正在嘗試從頭開始學習匯編。 我已經閱讀了很多,但即使是我在參考書中找到的以下簡單程序也讓我難倒:

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

現在顯然這應該打印“你好”。 但我什至不知道在任何階段發生了什么。 前兩個階段將消息長度和消息放在兩個寄存器中,不再使用。 我不明白為什么。

我不知道為什么需要四個不同的寄存器。

int 0x80是某些(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是您正在進行的系統調用,而ebxecxedx是三個參數(假設它們都是必需的 - 例如exit只需要一個)。

因此,您可以按如下方式注釋代碼:

move edx, len   ; length of message (nbyte).
move ecx, msg   ; message to print (buf).
move ebx, 1     ; file descriptor 1 (stdout).
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 0x80 ,某些英特爾芯片會快得多。

IIRC int 0x80指令用於通過使用中斷向量來調用系統調用。 在您的示例中, ebxeax中的值用於指定您要調用的系統調用(可能是 stdout 上的打印操作)。

系統調用通過約定知道edxecx應該包含將要打印的內容。

在許多系統上, int 80h系統調用門。 系統調用號在eax ebxecxedx包含附加參數:

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 = 標准輸出)
ecx = 字符串地址
edx = 字符串的長度

你可以閱讀這個:

http://www.intel.com/Assets/ja_JP/PDF/manual/253665.pdf

第 6.4 節有一些關於中斷和異常的內容。

並且可以開始編寫Intel 80x86匯編代碼,比較簡單易懂,這里有一些鏈接:

助記符/代碼表備忘單: http : //www.jegerlehner.ch/intel/

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM