經過理論鋪墊,現在正式進入語言實際操作和效果展示,該篇文章主要是介紹常用命令與命令的慣常用法;編寫、編譯一般的匯編程序;閱讀機器碼。
- 注意:本文匯編程序是X86環境下的,移植其他平臺可能產生錯誤。*
一、常用的命令
匯編代碼主要由助記符和操作數組成,格式通常如下
例:
MOV AX,0x10
上述例子只是一個簡單的舉例,事實上,mov指令還有能在多種用法,如下圖所示。
將上述上圖抽象出來便有以下關系:
MOV 目的,源
既:
MOV reg/mem,reg/mem/Imm
其中:
reg 寄存器
mem 內存
imm立即數
又可以在名稱后面跟數字表示位數,如imm32 就是可以操作32位數據。
必須明確,源操作數位數必須與目的操作數位數相同。
注:學習更多指令語法參考文末百度云書籍。
對機器而言這種編碼組織形式是高效的,作為人類這種高效無疑增加了復雜性。
現代不是計算機剛問世的時期,現代工程師要追求最優解。
經過工程師迭代,在匯編語言基礎上開發出來的編譯器普遍具有偽指令、標號等功能以便源文件具有較高可讀性。
例:
Start:;標號聲明該段代碼代號,標號不會參與編譯過程
MOV AX,0x10 ;0x10復制給AX寄存器
MOV CX,0x00 ;0x00復制給CX寄存器
ADD AX,CX ;AX寄存器值加上CX寄存器值
將上述程序存放起來,命名為10_01.asm,.asm為匯編源文件,使用NASM編譯。
編譯命令:nasm -f bin .\\10_01.asm -o .\\10_01.bin
其中:
nasm 執行程序
10_01.asm 源文件
-f bin 指定輸出文件格式為.bin
注:更多指令語法參考文末百度云書籍。
編譯后將.bin文件打開得到如下圖數據:
為研究方便,再對輸出文件進行反匯編。
將.bin文件在0x7c00處反編譯
使用命令:ndisasm -o 0x7c00 .\\10_01.bin >> .\\10_01-1.asm
得到:
00007C00B81000 mov ax,0x10
00007C03B90000 mov cx,0x0
00007C06 01C8 add ax,cx
現在所有東西都一目了然,在.bin文件中:
B8為mov AX指令所對應的機器碼,因為AX寬16位,而0x10為8位所以補兩個0湊夠16位,X86立即數先低位后高位存放0010在內存中便是1000;B9同理。
01為add指令機器碼,C8代表AX,CX兩個寄存器值相加。
- 二、Helloworld
現在了解了簡單的匯編語言,我們必須要查看一下效果。
為此,helloworld雖遲但到!
1、建立helloworld.asm
2、輸入以下指令
org 07c00h ;程序起始位07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $ ;死循環
DispStr:;字符串調用函數
mov ax,BootMessage
mov bp,ax ;串地址
mov cx,11 ;串長度
mov ax,01301h ;AH = 13,AL = 01h
mov bx,000ah ;黑底綠字
mov dl,0
int 10h ;10h號中斷
ret
BootMessage:db "Helloworld!"
times 510 - ($-$$)db 0
;生成一串512字節二進制代碼
dw 0xaa55 ;結束標志
3、編譯
nasm -f bin .\\helloworld.asm -o .\\helloworld.bin
4、效果
上述源碼看客們可以先行閱讀,下一篇推文對源碼進行解析。
參考文獻:
[1]Nasm.[EB/OL]. http://www.bytekits.com/nasm/intro.html.
[2] 蹦蹦騎士.[EB/OL].https://www.cnblogs.com/alwaysking/p/7623781.html#:~:text=%E7%BC%96%E
[3] 萬一.[EB/OL]. https://www.cnblogs.com/del/archive/2010/03/16/1687665.html.-.
[4]INTEl.[EB/OL]. https://css.csail.mit.edu/6.858/2015/readings/i386.pdf.-.
-
匯編程序
+關注
關注
0文章
58瀏覽量
16208 -
編譯
+關注
關注
0文章
661瀏覽量
33042 -
匯編代碼
+關注
關注
0文章
24瀏覽量
7567
發布評論請先 登錄
相關推薦
評論