機(jī)器語(yǔ)言我們只要重點(diǎn)理解一下幾個(gè)概念:
1. 機(jī)器語(yǔ)言指令有操作碼(OP)和地址碼兩部分組成 |_____________OP_______________|__d__|__w__| |_____________OP_______________|__s__|__w__| <--此格式用于立即尋址方式
在多數(shù)操作碼中,常使用某些位來(lái)指示某些信息: 如圖上結(jié)構(gòu)里的: w=1 時(shí) 對(duì)字來(lái)操作 w=0 時(shí) 對(duì)字節(jié)來(lái)操作 d值在雙操作數(shù)指令中才有效 當(dāng) d=1 時(shí) 有且只有一個(gè)寄存器用于目的操作數(shù) d=0 時(shí) 有且只有一個(gè)寄存器用于源操作數(shù) s=1 時(shí) 立即數(shù)為8位,但要求擴(kuò)展成16位數(shù) s=0 時(shí) 當(dāng)指令作字節(jié)操作/有16位立即數(shù) 由于匯編的指令格式很多,這里我只作一些基本情況介紹,必要時(shí)讀者可以下載/查閱80x86匯編小站http://www.x86asm.com提供的OPCODES手冊(cè)來(lái)查閱。 2. 尋址方式的機(jī)器語(yǔ)言表示: | mod | reg | r/m | |_____|_____|_____|_____|_____|_____|_____| reg 表示寄存器方式,在不包括立即數(shù)的雙操作數(shù)指令的情況下,規(guī)定必須有一個(gè)操作數(shù)在寄存器中,該寄存器由reg字段指定,并與操作碼字節(jié)中的w位相組合確定的寄存器 mod字段與r/m(register/memory)字段結(jié)合在一起確定另一個(gè)操作數(shù)的尋址方式現(xiàn)在你們下載了80x86匯編小站(http://www.x86asm.com)提供的OPCODES 手冊(cè)了嗎? 下載好了,請(qǐng)解壓后打開里面的:opcodes.html 文件,然后熟悉里面的表格:
現(xiàn)在熟悉簡(jiǎn)單的: ______________________________________________________________________________ 表1 <PS:部分資料> rrr : W=0 : W=1 : reg32 000 : AL : AX : EAX 001 : CL : CX : ECX 010 : DL : DX : EDX 011 : BL : BX : EBX 100 : AH : SP : ESP 101 : CH : BP : EBP 110 : DH : SI : ESI 111 : BH : DI : EDI ______________________________________________________________________________ 表2 <PS:部分資料> rrr : Index Register 000 : EAX 001 : ECX 010 : EDX 011 : EBX 100 : No Index 101 : EBP 110 : ESI 111 : EDI ______________________________________________________________________________ 表3 <PS:部分資料> mmm : Function 11 w=1 000 : DS:[BX+SI] 001 : DS:[BX+DI] 010 : SS:[BP+SI] 011 : SS:[BP+DI] BX 100 : DS:[SI] 101 : DS:[DI] 110 : SS:[BP] 111 : DS:[BX] ______________________________________________________________________________ 表4 <PS:部分資料> oo : Function 00 : If mmm = 110, then a displacement follows the operation; otherwise, no displacement is used 01 : An 8-bit signed displacement follows the opcode 10 : A 16-bit signed displacement follows the opcode 11 : mmm specifies a register, instead of an addressing mode ______________________________________________________________________________ 上面的表,你都看明白了嗎? 現(xiàn)在我就教你們?nèi)绾卫眠@樣的表格來(lái)把匯編指令翻譯機(jī)器碼 3.指令格式簡(jiǎn)介 8086所用的16位指令格式: ________ _____________ ________ ________ |操作碼| + |mod-reg-r/m| + |位移量| + |立即數(shù)| 1~2字節(jié) 0~1字節(jié) 0~2字節(jié) 0~2字節(jié)
OK!以上就是基本知識(shí),下面我們來(lái)實(shí)踐吧: ——————————————————————————————————————— 問(wèn)題: MOV AX,1234H 對(duì)應(yīng)的機(jī)器碼為:B83412 MOV EBX,0 對(duì)應(yīng)的機(jī)器碼為:66BB00000000 MOV CL,55H 對(duì)應(yīng)的機(jī)器碼為: B155
MOV AX,BX 對(duì)應(yīng)的機(jī)器碼為:8BC3
我在問(wèn)一下,機(jī)器碼的數(shù)據(jù)格式是什么? 好像是 機(jī)器指令+操作數(shù)(高位存放在地址高位,低位存放在地址低位),但是前面MOV AX,怎么就變成了B8,弄不明白,請(qǐng)指教。 PS: 上面的題目是一個(gè)網(wǎng)友問(wèn)的,現(xiàn)在我來(lái)實(shí)踐一遍給你們看。 ——————————————————————————————————————— 指令1 -> MOV AX,1234H 對(duì)應(yīng)的機(jī)器碼為:B83412 解法: 判斷-> 這個(gè)是8086匯編16位匯編指令格式,并且是立即尋址方式 查表-> 打開opcodes.html文件,找到標(biāo)題為“Main Instructions”,單擊“M”字母,然后對(duì)應(yīng)查看 “MOV Reg,Imm”格式的“OpCode”項(xiàng)為:1011wrrr 再判斷-> 由于寄存器是AX, 立即數(shù)是1234H,明顯是“對(duì)字操作”,所以w=1 在查看本文章上面的“表1”,對(duì)應(yīng)的查到rrr的值為000 組合結(jié)果-> w=1 rrr=000 1011wrrr=1011 1000B ->B8H 根據(jù)“ 3.指令格式簡(jiǎn)介” -> B8H + |立即數(shù)(低位在前高位在后)|= B83412H PS: "+" 符號(hào)不為“加號(hào)” 好了,已經(jīng)解完第一題了,機(jī)器碼為 B83412H ——————————————————————————————————————— 指令4 -> MOV AX,BX 對(duì)應(yīng)的機(jī)器碼為:8BC3 解法: 判斷-> 這個(gè)是8086匯編16位匯編指令格式,并且是寄存器尋址方式 查表-> 打開opcodes.html文件,找到標(biāo)題為“Main Instructions”,單擊“M ”字母,然后對(duì)應(yīng)查看 “MOV Reg,Reg”格式的“OpCode”項(xiàng)為:1000101woorrrmmm 再判斷-> 由于寄存器是AX, BX 明顯是“對(duì)字操作”,所以w=1 在查看本文章上面的“表4”,對(duì)應(yīng)查到oo=11 因?yàn)槭羌拇嫫鲗ぶ贩绞?br>在查看本文章上面的“表1”,對(duì)應(yīng)查到rrr的值為000 ,因?yàn)楫?dāng)兩個(gè)操 作數(shù)都是寄存器,那么一般要以目的操作數(shù)為準(zhǔn) 在查看本文章上面的“表3”, 對(duì)應(yīng)查到mmm的值為011 ,因?yàn)楫?dāng)兩個(gè)操作數(shù)都是寄存器,那么一般要以源操作數(shù)為準(zhǔn) 組合結(jié)果-> w=1 oo=11 rrr=000 mmm=011 1000101woorrrmmm=1000 1011 1100 0011B ->8BC3H 好了,已經(jīng)解完第二題了,機(jī)器碼為8BC3H ——————————————————————————————————————— 呵呵,不錯(cuò)吧,很簡(jiǎn)單吧,有了80X86 OPCODES 查詢表一切都是那么簡(jiǎn)單,如果還有什么問(wèn)題,大家都來(lái)這里提問(wèn)! 剩下的: 指令2 -> MOV EBX,0 對(duì)應(yīng)的機(jī)器碼為:66BB00000000 指令3 -> MOV CL,55H 對(duì)應(yīng)的機(jī)器碼為: B155 大家來(lái)練練手,注意指令2 需要用到32位指令格式,請(qǐng)查閱相關(guān)的80x86匯編語(yǔ)言書籍的機(jī)器語(yǔ)言部分,應(yīng)該有解釋的。 指令2的解法,請(qǐng)大家等待,或者大家研究一下,把解法貼出來(lái),給大家參考哦! |