經(jīng)過(guò)理論鋪墊,現(xiàn)在正式進(jìn)入語(yǔ)言實(shí)際操作和效果展示,該篇文章主要是介紹常用命令與命令的慣常用法;編寫、編譯一般的匯編程序;閱讀機(jī)器碼。
- 注意:本文匯編程序是X86環(huán)境下的,移植其他平臺(tái)可能產(chǎn)生錯(cuò)誤。*
一、常用的命令
匯編代碼主要由助記符和操作數(shù)組成,格式通常如下
例:
MOV AX,0x10
上述例子只是一個(gè)簡(jiǎn)單的舉例,事實(shí)上,mov指令還有能在多種用法,如下圖所示。
將上述上圖抽象出來(lái)便有以下關(guān)系:
MOV 目的,源
既:
MOV reg/mem,reg/mem/Imm
其中:
reg 寄存器
mem 內(nèi)存
imm立即數(shù)
又可以在名稱后面跟數(shù)字表示位數(shù),如imm32 就是可以操作32位數(shù)據(jù)。
必須明確,源操作數(shù)位數(shù)必須與目的操作數(shù)位數(shù)相同。
注:學(xué)習(xí)更多指令語(yǔ)法參考文末百度云書(shū)籍。
對(duì)機(jī)器而言這種編碼組織形式是高效的,作為人類這種高效無(wú)疑增加了復(fù)雜性。
現(xiàn)代不是計(jì)算機(jī)剛問(wèn)世的時(shí)期,現(xiàn)代工程師要追求最優(yōu)解。
經(jīng)過(guò)工程師迭代,在匯編語(yǔ)言基礎(chǔ)上開(kāi)發(fā)出來(lái)的編譯器普遍具有偽指令、標(biāo)號(hào)等功能以便源文件具有較高可讀性。
例:
Start:;標(biāo)號(hào)聲明該段代碼代號(hào),標(biāo)號(hào)不會(huì)參與編譯過(guò)程
MOV AX,0x10 ;0x10復(fù)制給AX寄存器
MOV CX,0x00 ;0x00復(fù)制給CX寄存器
ADD AX,CX ;AX寄存器值加上CX寄存器值
將上述程序存放起來(lái),命名為10_01.asm,.asm為匯編源文件,使用NASM編譯。
編譯命令:nasm -f bin .\\10_01.asm -o .\\10_01.bin
其中:
nasm 執(zhí)行程序
10_01.asm 源文件
-f bin 指定輸出文件格式為.bin
注:更多指令語(yǔ)法參考文末百度云書(shū)籍。
編譯后將.bin文件打開(kāi)得到如下圖數(shù)據(jù):
為研究方便,再對(duì)輸出文件進(jìn)行反匯編。
將.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
現(xiàn)在所有東西都一目了然,在.bin文件中:
B8為mov AX指令所對(duì)應(yīng)的機(jī)器碼,因?yàn)锳X寬16位,而0x10為8位所以補(bǔ)兩個(gè)0湊夠16位,X86立即數(shù)先低位后高位存放0010在內(nèi)存中便是1000;B9同理。
01為add指令機(jī)器碼,C8代表AX,CX兩個(gè)寄存器值相加。
- 二、Helloworld
現(xiàn)在了解了簡(jiǎn)單的匯編語(yǔ)言,我們必須要查看一下效果。
為此,helloworld雖遲但到!
1、建立helloworld.asm
2、輸入以下指令
org 07c00h ;程序起始位07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $ ;死循環(huán)
DispStr:;字符串調(diào)用函數(shù)
mov ax,BootMessage
mov bp,ax ;串地址
mov cx,11 ;串長(zhǎng)度
mov ax,01301h ;AH = 13,AL = 01h
mov bx,000ah ;黑底綠字
mov dl,0
int 10h ;10h號(hào)中斷
ret
BootMessage:db "Helloworld!"
times 510 - ($-$$)db 0
;生成一串512字節(jié)二進(jìn)制代碼
dw 0xaa55 ;結(jié)束標(biāo)志
3、編譯
nasm -f bin .\\helloworld.asm -o .\\helloworld.bin
4、效果
上述源碼看客們可以先行閱讀,下一篇推文對(duì)源碼進(jìn)行解析。
參考文獻(xiàn):
[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] 萬(wàn)一.[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.-.
-
匯編程序
+關(guān)注
關(guān)注
0文章
56瀏覽量
16162 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32852 -
匯編代碼
+關(guān)注
關(guān)注
0文章
23瀏覽量
7548
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論