X86匯編問答

1.地址總線,數(shù)據(jù)總線,控制總線在哪里,它們有什么作用?
答:它們都是cpu連接外部組件的線路。
地址總線:
地址總線AB用于傳送CPU發(fā)出的地址信息,是單向的。傳送地址信息的目的是指明與CPU交換信息的內(nèi)存單元或I/O設(shè)備。邏輯概念可以理解為外部件連接變址寄存器的數(shù)字電路。
數(shù)據(jù)總線:
數(shù)據(jù)總線DB用來傳送數(shù)據(jù)信息,是雙向的。CPU既可通過DB從內(nèi)存或輸入設(shè)備讀入數(shù)據(jù),又可通過DB將內(nèi)部數(shù)據(jù)送至內(nèi)存或輸出設(shè)備。邏輯概念可以理解為外部件連接數(shù)據(jù)寄存器的數(shù)字電路。
控制總線:
控制總線CB用來傳送控制信號、時序信號和狀態(tài)信息等。其中有的是CPU向內(nèi)存或外部設(shè)備發(fā)出的信息,有的是內(nèi)存或外部設(shè)備向CPU發(fā)出的信息。顯然,CB中的每一條線的信息傳送方向是一定的、單向的,但作為一個整體則是雙向的。邏輯概念可以理解為外部件連接指令和標志位寄存器等。

2.1個CPU 的尋址能力為1MB,那么它的地址總線的寬度為多少?
答:寬度為20位。

3.在存儲器中(內(nèi)存),數(shù)據(jù)和程序以什么形式存放?
答:二進制

4.匯編語言中的指令和數(shù)據(jù)有區(qū)別嗎?
答:匯編語言中使用的一些操作符和助記符,還包括一些偽指令(如assume,end)。用于告訴匯編如何進行匯編的指令,它既不控制機器的操作也不被匯編成機器代碼,只能為匯編程序所識別并指導匯編如何進行。而數(shù)據(jù)只是單純的某種進制數(shù)據(jù)表示和存儲單元。

5.下面是一些簡單的匯編指令和指令對應(yīng)的功能:
MOV eax ,10
ADD eax ,10
MOV ebx ,eax

請寫出下面每條匯編指令執(zhí)行后相關(guān)寄存器中的值:
mov eax,123 eax:123

mov ebx ,eax ebx:123 eax:123

add eax,100 eax:223

add eax ,ebx eax:346 ebx:123

add ebx,eax ebx:469 eax:346
eip 寄存器能直接被修改嗎? 哪些指令能夠間接修改這個寄存器?

答:指令指針eip寄存器不能直接被修改,可以間接修改eip的有call,ret,jmp,jcc。

6.請將下面匯編語言中的指令和C 語言中的關(guān)鍵字按照功能連線。
不使用連線,對應(yīng)如下:

MOV =(賦值語句)
CMP if
JMP goto
INC ++(自增運算)
DEC --(自減運算)
ADD +=

7.請列舉標志寄存器的標志位,并闡述這些標志位在什么情況下會發(fā)生改變
答:狀態(tài)標志位
CF carry flag 進位標志 當運算結(jié)果的最高有效位有進位或者借位時CF = 1,否則為0
ZF zero flag 零標志位 當運算結(jié)果為0時ZF=1,否則為0
SF sign flag 符號標志位 當運算結(jié)果最高位為1,SF=1,否則為0。
PF parity flag 奇偶標志位 當運算的結(jié)果最低八位中“1”的個數(shù)為零或者偶數(shù)時,PF=1,否則PF=0
OF overflow flag 溢出標志 當算術(shù)運算的結(jié)果又溢出,則OF=1,否則OF=0
AF auxiliary carry flag 輔助進位標志 運算時D3位(低半字節(jié))有進位或者借位時AF=1,否則為零

控制標志位
DF direction flag 方向標志 存儲器地址自動增加時為零,自動減少時為1
IF interrupt-enable flag 設(shè)置為1時,允許中斷,為零則禁止中斷
TF trap flag 設(shè)置TF=0時,處理器正常工作,為1時處理器單步執(zhí)行指令

================
1.常用的寄存器都有哪些?
答:
8086(16位)14個:
ax bx cx dx (ah al bh bl ch cl dh dl)
si di sp bp
cs es ss ds
flags ip

32位16個:
eax ebx ecx edx (ah al bh bl ch cl dh dl)
esi edi esp ebp
ecs ees ess eds efs egs
eflags eip

2.通用寄存器:eax,ebx,ecx,edx,esi,edi,ebp,esp
簡述上述存儲器的作用
答:前綴均為Extra
eax 累加器(Accumulator),用累加器進行的操作可能需要更少時間。可用于乘、 除、輸入/輸出等操作,使用頻率很高
ebx 基地址寄存器(Base Register)。它可作為存儲器指針來使用
ecx (count)串操作、循環(huán)控制的計數(shù)器
edx 數(shù)據(jù)寄存器(Data Register)。在進行乘、除運算時,它可作為默認的操作數(shù)參與運算,也可用于存放I/O的端口地址
esi (Source Index):源變址寄存器。存儲器指針、串指令中的源操作數(shù)指針
edi (destination index)目標變址寄存器。存儲器指針、串指令中的目的操作數(shù)指針
ebp 基指針(Base Pointer)寄存器,用它可直接存取堆棧中的數(shù)據(jù)
esp 堆棧指針(Stack Pointer)寄存器,用它只可訪問棧頂。

在16位CPU中,AX、BX、CX和DX不能作為基址和變址寄存器來存放存儲單元的地址,
在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不僅可傳送數(shù)據(jù)、暫存數(shù)據(jù)保存算術(shù)邏輯運算結(jié)果,
而且也可作為指針寄存器,所以,這些32位寄存器更具有通用性。

3.標志位都有哪些?
答:
狀態(tài)標志位
CF carry flag 進位標志 當運算結(jié)果的最高有效位有進位或者借位時CF = 1,否則為0
ZF zero flag 零標志位 當運算結(jié)果為0時ZF=1,否則為0
SF sign flag 符號標志位 當運算結(jié)果最高位為1,SF=1,否則為0。
PF parity flag 奇偶標志位 當運算的結(jié)果最低八位中“1”的個數(shù)為零或者偶數(shù)時,PF=1,否則PF=0
OF overflow flag 溢出標志 當算術(shù)運算的結(jié)果又溢出,則OF=1,否則OF=0
AF auxiliary carry flag 輔助進位標志 運算時D3位(低半字節(jié))有進位或者借位時AF=1,否則為零

控制標志位
DF direction flag 方向標志 存儲器地址自動增加時為零,自動減少時為1
IF interrupt-enable flag 設(shè)置為1時,允許中斷,為零則禁止中斷
TF trap flag 設(shè)置TF=0時,處理器正常工作,為1時處理器單步執(zhí)行指令

32位新增標志位
1、I/O特權(quán)標志IOPL(I/O Privilege Level)
I/O特權(quán)標志用兩位二進制位來表示,也稱為I/O特權(quán)級字段。該字段指定了要求執(zhí)行I/O指令的特權(quán)級。
如果當前的特權(quán)級別在數(shù)值上小于等于IOPL的值,那么,該I/O指令可執(zhí)行,否則將發(fā)生一個保護異常。
2、嵌套任務(wù)標志NT(Nested Task)
嵌套任務(wù)標志NT用來控制中斷返回指令I(lǐng)RET的執(zhí)行。具體規(guī)定如下:
(1)、當NT=0,用堆棧中保存的值恢復EFLAGS、CS和EIP,執(zhí)行常規(guī)的中斷返回操作;
(2)、當NT=1,通過任務(wù)轉(zhuǎn)換實現(xiàn)中斷返回。
3、重啟動標志RF(Restart Flag)
重啟動標志RF用來控制是否接受調(diào)試故障。規(guī)定:RF=0時,表示“接受”調(diào)試故障,否則拒絕之。
在成功執(zhí)行完一條指令后,處理機把RF置為0,當接受到一個非調(diào)試故障時,處理機就把它置為1。
如果該標志的值為1,則表示處理機處于虛擬的8086方式下的工作狀態(tài),否則,處理機處于一般保護方式下的工作狀態(tài)。

4、虛擬8086方式標志VM(Virtual 8086 Mode)

4.16位cpu和32位cpu中的尋址有什么區(qū)別?
答:16位cpu尋址,8086有20位地址總線,地址范圍為1M字節(jié)單元,但cpu是16位的,因此需分段處理。32位尋址則其cpu的數(shù)據(jù)總線應(yīng)是32位的,一次性可尋址范圍為2的32次方,也就是4G了。

5.請說出你記得的常用指令
1)、數(shù)據(jù)傳輸指令

  1. 通用數(shù)據(jù)傳送指令.
    MOV 傳送字或字節(jié).
    MOVSX 先符號擴展,再傳送.
    MOVZX 先零擴展,再傳送.
    PUSH 把字壓入堆棧.
    POP 把字彈出堆棧.
    PUSHF
    PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆棧.
    POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆棧.
    PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆棧.
    POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆棧.
    BSWAP 交換32位寄存器里字節(jié)的順序
    XCHG 交換字或字節(jié).( 至少有一個操作數(shù)為寄存器,段寄存器不可作為操作數(shù))
    CMPXCHG 比較并交換操作數(shù).( 第二個操作數(shù)必須為累加器AL/AX/EAX )
    XADD 先交換再累加.( 結(jié)果在第一個操作數(shù)里 )
    XLAT 字節(jié)查表轉(zhuǎn)換.
    BX 指向一張 256 字節(jié)的表的起點, AL 為表的索引值 (0-255,即 0-FFH); 返回 AL 為查表結(jié)果. ( [BX+AL]->AL )
  2. 輸入輸出端口傳送指令.
    IN I/O端口輸入. ( 語法: IN 累加器, {端口號│DX} )
    OUT I/O端口輸出. ( 語法: OUT {端口號│DX},累加器 )
    輸入輸出端口由立即方式指定時, 其范圍是 0-255; 由寄存器 DX 指定時,其范圍是 0-65535.
  3. 目的地址傳送指令.
    LEA 裝入有效地址.
    例: LEA DX,string ;把偏移地址存到DX.
    LDS 傳送目標指針,把指針內(nèi)容裝入DS.
    例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
    LES 傳送目標指針,把指針內(nèi)容裝入ES.
    例: LES DI,string ;把段地址:偏移地址存到ESDI.
    LFS 傳送目標指針,把指針內(nèi)容裝入FS.
    例: LFS DI,string ;把段地址:偏移地址存到FSD.
    LGS 傳送目標指針,把指針內(nèi)容裝入GS.
    例: LGS DI,string ;把段地址:偏移地址存到GSDI.
    LSS 傳送目標指針,把指針內(nèi)容裝入SS.
    例: LSS DI,string ;把段地址:偏移地址存到SSDI.
  4. 標志傳送指令.
    LAHF 標志寄存器傳送,把標志裝入AH.
    SAHF 標志寄存器傳送,把AH內(nèi)容裝入標志寄存器.
    PUSHF 標志入棧.
    POPF 標志出棧.
    PUSHD 32位標志入棧.
    POPD 32位標志出棧.

2)、算術(shù)與邏輯運算指令
算術(shù)運算指令 :
ADD 加法.
ADC 帶進位加法.
INC 加 1.
AAA 加法的ASCII碼調(diào)整.
DAA 加法的十進制調(diào)整.
SUB 減法.
SBB 帶借位減法.
DEC 減 1.
NEC 求反(以 0 減之).
CMP 比較.(兩操作數(shù)作減法,僅修改標志位,不回送結(jié)果).
AAS 減法的ASCII碼調(diào)整.
DAS 減法的十進制調(diào)整.
MUL 無符號乘法.
IMUL 整數(shù)乘法.
以上兩條,結(jié)果回送AH和AL(字節(jié)運算),或DX和AX(字運算),
AAM 乘法的ASCII碼調(diào)整.
DIV 無符號除法.
IDIV 整數(shù)除法.
以上兩條,結(jié)果回送:
商回送AL,余數(shù)回送AH, (字節(jié)運算);
或 商回送AX,余數(shù)回送DX, (字運算).

CBW 字節(jié)轉(zhuǎn)換為字. (把AL中字節(jié)的符號擴展到AH中去)
CWD 字轉(zhuǎn)換為雙字. (把AX中的字的符號擴展到DX中去)
CWDE 字轉(zhuǎn)換為雙字. (把AX中的字符號擴展到EAX中去)
CDQ 雙字擴展. (把EAX中的字的符號擴展到EDX中去)
AAD 除法的ASCII碼調(diào)整.

邏輯運算指令 :
AND 與運算.
NOT 取反.
TEST 測試.(兩操作數(shù)作與運算,僅修改標志位,不回送結(jié)果).
SHL 邏輯左移.
SAL 算術(shù)左移.(=SHL)
SHR 邏輯右移.
SAR 算術(shù)右移.(=SHR)
ROL 循環(huán)左移.
ROR 循環(huán)右移.
RCL 通過進位的循環(huán)左移.
RCR 通過進位的循環(huán)右移.
以上八種移位指令,其移位次數(shù)可達255次.
移位一次時, 可直接用操作碼. 如 SHL AX,1.
移位>1次時, 則由寄存器CL給出移位次數(shù).
如 MOV CL,04
SHL AX,CL

XOR 異或運算.
OR 或運算.
3)、串操作指令

DS:SI 源串段寄存器 :源串變址.
ESI 目標串段寄存器:目標串變址.
CX 重復次數(shù)計數(shù)器.
AL/AX 掃描值.
D標志 0表示重復操作中SI和DI應(yīng)自動增量; 1表示應(yīng)自動減量.
Z標志 用來控制掃描或比較操作的結(jié)束.
MOVS 串傳送.
( MOVSB 傳送字符. MOVSW 傳送字. MOVSD 傳送雙字. )
CMPS 串比較.
( CMPSB 比較字符. CMPSW 比較字. )
SCAS 串掃描.
把AL或AX的內(nèi)容與目標串作比較,比較結(jié)果反映在標志位.
LODS 裝入串.
把源串中的元素(字或字節(jié))逐一裝入AL或AX中.
( LODSB 傳送字符. LODSW 傳送字. LODSD 傳送雙字. )
STOS 保存串.
是LODS的逆過程.
REP 當CX/ECX<>0時重復.
REPE/REPZ 當ZF=1或比較結(jié)果相等,且CX/ECX<>0時重復.
REPNE/REPNZ 當ZF=0或比較結(jié)果不相等,且CX/ECX<>0時重復.
REPC 當CF=1且CX/ECX<>0時重復.
REPNC 當CF=0且CX/ECX<>0時重復.

4)、其它指令
SEG -------------------- 返回段地址
EQU(=) -------------------- 等值語句
PURGE -------------------- 解除語句
DUP -------------------- 操作數(shù)字段用復制操作符
SEGMENT,ENDS -------------------- 段定義指令
ASSUME -------------------- 段地址分配指令
ORG -------------------- 起始偏移地址設(shè)置指令
$ --------------------地址計數(shù)器的當前值
PROC,ENDP -------------------- 過程定義語句
NAME,TITLE,END -------------------- 程序開始結(jié)束語句
MACRO,ENDM --------------------宏定義指令
XLAT (TRANSLATE) --------------- 換碼指令
OFFSET -------------------- 返回偏移地址

6.請指出常用的尋址方式有哪些?
答:常用的尋址方式有
立即數(shù)尋址
mov ax 1234

寄存器尋址
mov bx,ax

存儲器尋址分為如下:
直接尋址
mov ax,[2000h] 默認ds段
mov ax,es:[2000h]

寄存器相對尋址
mov ax,[di+06]

段地址對應(yīng)的bx/si/di 寄存器默認為DS,對應(yīng)BP寄存器的默認是SS

寄存器間接尋址
mov ax,[si]

基址變址尋址
mov ax,[bx,si]

相對基址變址尋址
mov ax,[bx+si+06h]

7、說說你理解的棧是什么?
答:一種先進后出的數(shù)據(jù)結(jié)構(gòu),一種存儲數(shù)據(jù)的載體形式,附加了操作數(shù)據(jù)的行為方法,其中棧頂是唯一出口。比如棧內(nèi)存,棧寄存器。一般局部變量, 函數(shù)參數(shù), 返回地址都放在棧中。

8.函數(shù)在匯編中是什么樣的?
答:函數(shù)在匯編中聲明如下
函數(shù)名 proto :參數(shù)類型,:參數(shù)類型,......

函數(shù)的定義如下:
函數(shù)名 proc 參數(shù)名:類型,參數(shù)名:類型,......
ret
函數(shù)名 endp

或者
invoke 函數(shù)名,參數(shù),addr 參數(shù)

或者不用偽指令
直接
push 參數(shù)
push 參數(shù)
call 函數(shù)名

3.填空選擇題

  1. 指令指針寄存器是 eip

10.在串操作指令前使用重復前綴指令REPE,終止串的重復操作條件是 cx為零或zf為零

11.請列舉出通用寄存器有哪些? 棧寄存器有哪些?
答:通用寄存器有數(shù)據(jù)寄存器,變址寄存器,棧寄存器;棧寄存器有ebp,esp。

12.下列屬于合法的指令是( D )
A.MOV DS,ES //給段寄存器賦值一定要用通用寄存器
B.MOV [ESI],[EDI] //兩個操作數(shù)中,必須有一個是寄存器
C.MOV EAX,BL //長度不對
D.MOV [EDI],EBX

13.在下列指令中,D 指令的執(zhí)行會影響條件碼中的CF 位。
A.JMP NEXT
B.JC NEXT
C. INC BX
D.SHL AX,1

  1. 在VS DEBUG 模式下反編譯的程序中EBP 中存放的是 十六進制數(shù)據(jù)

15.在字符串操作指令中,DS : ESI 指向源串,ES : DSI 指向目的串。

  1. CPU 要訪問的某一存儲單元的實際地址稱 物理地址

  2. 循環(huán)控制指令LOOPNZ/LOOPNE 控制循環(huán)繼續(xù)執(zhí)行的條件是 CX=0 且ZF=0

  3. REPZ CMPSW指令,重復執(zhí)行的終止條件是 cx為零或zf為零

19.用2 種方法將eax 中的值擴大4 倍,請寫出匯編指令
(1) SHL EAX,2
(2) IMUL EAX,4

20.與MOV BX,OFFSET VAR指令完全等效的指令是 lea bx,var

======================
1.溢出標志和進位標志有什么區(qū)別?
答:溢出標志是OF,表示有符號數(shù)運算結(jié)果是否超出范圍,運算結(jié)果已經(jīng)不正確。進位標志是CF,表示無符號數(shù)運算結(jié)果是否超出范圍,運算結(jié)果仍然正確。

2.數(shù)據(jù)傳輸指令有哪些,請至少列舉5 個。
答:數(shù)據(jù)傳輸指令有mov, push,pushf , pusha, pop ,lea ,movs ,xchg ,movsx,movzx等

3.push 和pushf指令有什么區(qū)別?
答:push和pushf指令可將源操作數(shù)壓入棧中,push是普通將字壓棧,pushf是標志入棧指令。

4.inc 指令會影響哪些標志位?
答:inc指令會影響的標志位有SF ZF PF AF OF

5.imul 指令和mul 指令有什么區(qū)別?
答:imul指令用于有符號數(shù)的乘法,操作數(shù)的個數(shù)為1-3個;而mul是無符號數(shù)的乘法指令,操作個數(shù)1-2。

6.cmps 指令會影響哪些標志位?
答:AF、CF、OF、SF、PF、ZF。

7.自學一條新指令(使用指導資料的指令介紹格式)
答:XADD 交換并相加指令
交換第一個操作數(shù)(目標操作數(shù))與第二個操作數(shù)(源操作數(shù)),然后將這兩個值的和加載到目標操作數(shù)。目標操作數(shù)可以是寄存器或內(nèi)存位置;源操作數(shù)是寄存器。
CF、PF、AF、SF、ZF 及 OF 標志根據(jù)存儲到目標操作數(shù)的加法結(jié)果設(shè)置。

8.使用mov 指令實現(xiàn)交換存放在寄存器(交換eax 和ebx 中的數(shù)) 中數(shù):
答:
push eax
mov eax,ebx
mov ebx,[esp]

9.使用xchg 指令實現(xiàn)交換edx 和esp中的數(shù)據(jù):
答:xchg edx,[esp]

10.已知eax=1,ecx=2,運行l(wèi)ea eax,dword ptr [ecx] 指令后eax=2 ecx=2

11.在32 位匯編中,已知esp=2000,執(zhí)行pop eax 后esp=2004 再執(zhí)行push 指令后esp= 2000

12.執(zhí)行PUSHA指令后會執(zhí)行哪些操作?執(zhí)行POPA指令后會執(zhí)行哪些操作?
壓入8 個通寄存器,順序為:EAXECXEDXEBXESPEBPESEDPOPA 和以上:相反,EDI 開始到EAX 結(jié)束

13.已知cf 標志位為0,eax = 0fffffffh 執(zhí)行inc ax 指令,eax= 10000000, cf=0

14.執(zhí)行指令imul ebx,dword ptr[1000],10,偏移地址1000 處的數(shù)據(jù)為5,則ebx=50

15.假設(shè)eax=100,符號位SF=0,執(zhí)行指令cmp eax,200,后eax= 100 ,sf=1

16.已知eax =0xffffffff ,cf=0,執(zhí)行not eax 后eax=0 ,cf=0

17.在VS 反匯編代碼進入函數(shù)后會有下面一段代碼,那么下面這段代碼有具體在做什么呢?
lea edi,[ebp-0E4h]
mov ecx,39h
mov eax,0CCCCCccch
rep stos dword ptr es:[edi]

把??臻g初始化為CC

18.C 語言的函數(shù)聲明為voidTest (),函數(shù)test 內(nèi)部最后一句反匯編代碼和調(diào)用處如下:
int Test()
{
0032145B ret
............

}

003214D5 call Test (0321050h)

003214DA mov dword ptr [ret],eax

則執(zhí)行ret 前eip=0032145B ,執(zhí)行ret 后eip= 003214DA

19.已知一個整形變量n=0, 以下
int n = 0;
_asm mov eax,0x0000ffff
_asm mov ebx,0xffff0000
_asm or eax,ebx
_asm mov n,eax
printf("%d",n);
指令在VS 內(nèi)嵌匯編中執(zhí)行,然后print("%d",n)將輸出 -1

========================

1.OPCode 和匯編語言有什么關(guān)系?
答:OPCode與匯編指令并非是單純的對應(yīng)關(guān)系,同一opcode對應(yīng)的匯編指令不一定相同,反之也一樣。

  1. OPCode 就是機器碼嗎?
    答:不一定就是,例如PHP虛擬機(Zend VM)、java虛擬機(JVM)以及一些軟件保護虛擬機中的最小操作單元都可以稱之為OPCode。在計算機科學領(lǐng)域中,操作碼(Operation Code, OPCode)被用于描述機器語言指令中,指定要執(zhí)行某種操作的那部分機器碼,構(gòu)成OPCode的指令格式和規(guī)范由處理器的指令規(guī)范指定。

  2. 所有不同架構(gòu)的CPU 都有自己的OPCode 嗎?
    答:可能是自己的也可能和其他一樣。

3.填空題

  1. OPCode 為0xCC 匯編語言代碼為 int 3 ,OPCode 為0X50 匯編語言代碼為 push eax
  1. 80X86 匯編指令最少由 1 個字節(jié)構(gòu)成,最多由 16 個字節(jié)構(gòu)成.

6.請寫出OPCode 的格式:
前綴prefixes+代碼code+構(gòu)造模式modR/M(mod+reg+r/m)+SIB+位移+立即數(shù)

7.請列舉所有OPCode 的前綴:
66 -- 切換操作數(shù)大小
67 -- 切換地址大小
F2/F3 -- 重復操作前綴
2E/36/3E/26/64/65 -- 修改默認段
F0 -- 鎖定前綴

  1. 切換操作數(shù)大小”切換"的意思是將其在兩種狀態(tài)間來回切換,而并非特指某種狀態(tài),那么OPCode 為40 的反匯編代碼為inc eax,那么加上前綴66 即OPCode 6640 的指令為 inc ax
    關(guān)于無效的前綴,那么OPCode 為8AC1的反編代碼為MOV AL,CL,那么加上前綴66 即OPCode 66 8AC1的指令為 mov al cl

  2. 創(chuàng)建操作數(shù)類型描述,常見操作數(shù)大小描述,請說明:
    常見操作數(shù)類型編碼和大小描述
    a 兩個單字內(nèi)存操作數(shù)或兩個雙字內(nèi)存操作數(shù),依據(jù)操作數(shù)尺寸屬性決定(僅在 BOUND 指
    令中使用)
    b 字節(jié),不論操作數(shù)尺寸屬性
    c 字節(jié)或字,依據(jù)操作數(shù)尺寸屬性決定
    d 雙字,不論操作數(shù)尺寸屬性
    dq 八字(Double-quadword),不論操作數(shù)尺寸屬性
    p 32 位,48 位或者 80 位指針,依據(jù)操作數(shù)尺寸屬性決定
    pd 128 位緊縮雙精度浮點數(shù)
    pi 四字 MMX 寄存器(如 mm0)
    ps 128 位緊縮單精度浮點數(shù)
    q 四字操作數(shù),不論操作數(shù)尺寸屬性
    s 6 字節(jié)或 10 字節(jié)偽描述符(pseudo-descriptor)
    ss 128 位緊縮單精度浮點數(shù)的標量部分(scalar element of a 128-bit packed single-precision
    floating data)
    si 雙字整數(shù)寄存器(如 eax)
    v 字,雙字或四字(64 位模式),依據(jù)操作數(shù)尺寸決定
    w 字,不論操作數(shù)尺寸
    z 在 16 位模式中為字,在 32 位或 64 位環(huán)境中為雙字

10.ModR/M 中的R/M 域為[--][--]時,表示什么意思:
SIB字節(jié)

11.ModR/M 部分由哪幾部分組成
比例scale 索引 index 基數(shù)base

12.根據(jù)ModR/M 信息確認是否有SIB字節(jié)可以查Intel 手冊,當Mod !=11b,并且.R/M 的
值為 100b 的時候,表示指令后續(xù)有SIB 字節(jié),并且該內(nèi)存操作對象由SIB 編碼。

4.擴展題
請在intel 手冊中查找OPCode:
F0:26:C7 8491AA00000011000000 的匯編代碼是
F0 :lock
26 :ES
C7 : mov Ev,Iz E:到MODR/M左邊找 32位,I:立即數(shù) 32位
84 : [--][--]+32disp
91 : [edx*4][ecx]

LOCK MOV DWORD PTR ES: [EDX*4 + ECX + 0AA], 11

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容