linux下的AT&T彙編——鍵盤輸入輸出,makefile文件的編寫

注:

1.linux的系統調用號在“/usr/include/asm/unistd.h”文件中,有32位和64位之分

2.linux下函數參數是用寄存器進行傳遞的,因此同時最多隻能傳遞6個參數。

3.linux的軟中斷號爲0x80,因此調用中斷彙編指令爲“int $0x80”(AT&T彙編)。

4.這裏涉及的功能號有三個,read爲3,write爲4,程序退出是1,要存入eax。

5.要將需要的功能號存入eax,然後執行中斷“int $0x80”。

代碼:

.section .bbs
.lcomm  buf,50    #.lcomm用來聲明一個名稱爲buf、長度爲50 byte的儲存區
.section .text
.globl _start    #.globl指定程序入口,建議標號設置爲“_start”,否則如果在linux中用ld鏈接時會有警告
_start:        #下面將參數存入相應的寄存器
movl $buf,%ecx    
movl $50,%edx
movl $0,%ebx
movl $3,%eax    #將3存入eax,執行“int $0x80”後,系統會調用sys_read,讀取字符
int $0x80

movl $1,%ebx
movl $4,%eax    #將4存入eax,執行“int $0x80”後,系統會調用sys_write相應的函數,向屏幕輸出buf內存區的字符
int $0x80
//下面的代碼用來退出程序,並返回0(返回值儲存在8位寄存器bl中,因此最大隻能返回255,。bl是16位寄存器bx的低8位,而bx是ebx的低16位)
movl $0,%ebx    
movl $1,%eax
int $0x80

以上程序的基本執行過程就是劃出一個50 byte的內存塊,將內存塊的首地址(即名稱:buf)存入ecx,內存塊長度存入edx,功能號3存入eax,軟件中斷(int),系統調用相應的讀取函數,從寄存器中獲取參數,執行,填滿內存塊。

然後返回程序,調用功能號4(之前爲ecx,edx存入的內容並沒有變),軟件中斷,系統調用相應的打印函數,再從寄存器獲取參數,向屏幕輸出內存塊的內容,輸出的字符數量由edx的值決定。打印完後自動返回程序。

最後向eax存入1,向ebx存入0,軟件中斷,程序退出,並向系統返回bl中的值(本程序中返回值是0,你可以使用"echo $?"命令來查看程序的返回值。)

運行結果如下:


你可以看到有一個make命令,這是用來編譯代碼用的,需要事先在該目錄下建立一個makefile文件。

對應這個小程序的makefile文件內容如下:

input:input.o

    ld input.o -o input

input.o:input.s

    as input.s -o input.o

makefile文件的寫法很簡單,就上面的內容而言:我們需要的可執行文件是input,如果想要生成input,需要input.o,因此第一行就是“input:input.o”,緊接着下一行,(ld和as前面是tab符號,不然會報錯),是生成input的命令“ld input.o -o input”,這樣就完成了一組make命令。簡單來講,基本格式如下:

你想要生成的文件:源文件

(tab)生成這個文件的命令

建議倒着來寫,即從你想要生成的最終文件向上回溯,這樣可以保證生成最新的目標文件(make程序可以自動判斷你的源文件是否修改過,來確定用不用再生成一次,避免了在編譯上浪費時間,在這點上真的很棒)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章