X86匯編問(wèn)答

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

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

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

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

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

請(qǐng)寫出下面每條匯編指令執(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 寄存器能直接被修改嗎? 哪些指令能夠間接修改這個(gè)寄存器?

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

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

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

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

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

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

32位16個(gè):
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
簡(jiǎn)述上述存儲(chǔ)器的作用
答:前綴均為Extra
eax 累加器(Accumulator),用累加器進(jìn)行的操作可能需要更少時(shí)間。可用于乘、 除、輸入/輸出等操作,使用頻率很高
ebx 基地址寄存器(Base Register)。它可作為存儲(chǔ)器指針來(lái)使用
ecx (count)串操作、循環(huán)控制的計(jì)數(shù)器
edx 數(shù)據(jù)寄存器(Data Register)。在進(jìn)行乘、除運(yùn)算時(shí),它可作為默認(rèn)的操作數(shù)參與運(yùn)算,也可用于存放I/O的端口地址
esi (Source Index):源變址寄存器。存儲(chǔ)器指針、串指令中的源操作數(shù)指針
edi (destination index)目標(biāo)變址寄存器。存儲(chǔ)器指針、串指令中的目的操作數(shù)指針
ebp 基指針(Base Pointer)寄存器,用它可直接存取堆棧中的數(shù)據(jù)
esp 堆棧指針(Stack Pointer)寄存器,用它只可訪問(wèn)棧頂。

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

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

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

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

4、虛擬8086方式標(biāo)志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.請(qǐng)說(shuō)出你記得的常用指令
1)、數(shù)據(jù)傳輸指令

  1. 通用數(shù)據(jù)傳送指令.
    MOV 傳送字或字節(jié).
    MOVSX 先符號(hào)擴(kuò)展,再傳送.
    MOVZX 先零擴(kuò)展,再傳送.
    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é).( 至少有一個(gè)操作數(shù)為寄存器,段寄存器不可作為操作數(shù))
    CMPXCHG 比較并交換操作數(shù).( 第二個(gè)操作數(shù)必須為累加器AL/AX/EAX )
    XADD 先交換再累加.( 結(jié)果在第一個(gè)操作數(shù)里 )
    XLAT 字節(jié)查表轉(zhuǎn)換.
    BX 指向一張 256 字節(jié)的表的起點(diǎn), AL 為表的索引值 (0-255,即 0-FFH); 返回 AL 為查表結(jié)果. ( [BX+AL]->AL )
  2. 輸入輸出端口傳送指令.
    IN I/O端口輸入. ( 語(yǔ)法: IN 累加器, {端口號(hào)│DX} )
    OUT I/O端口輸出. ( 語(yǔ)法: OUT {端口號(hào)│DX},累加器 )
    輸入輸出端口由立即方式指定時(shí), 其范圍是 0-255; 由寄存器 DX 指定時(shí),其范圍是 0-65535.
  3. 目的地址傳送指令.
    LEA 裝入有效地址.
    例: LEA DX,string ;把偏移地址存到DX.
    LDS 傳送目標(biāo)指針,把指針內(nèi)容裝入DS.
    例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
    LES 傳送目標(biāo)指針,把指針內(nèi)容裝入ES.
    例: LES DI,string ;把段地址:偏移地址存到ESDI.
    LFS 傳送目標(biāo)指針,把指針內(nèi)容裝入FS.
    例: LFS DI,string ;把段地址:偏移地址存到FSD.
    LGS 傳送目標(biāo)指針,把指針內(nèi)容裝入GS.
    例: LGS DI,string ;把段地址:偏移地址存到GSDI.
    LSS 傳送目標(biāo)指針,把指針內(nèi)容裝入SS.
    例: LSS DI,string ;把段地址:偏移地址存到SSDI.
  4. 標(biāo)志傳送指令.
    LAHF 標(biāo)志寄存器傳送,把標(biāo)志裝入AH.
    SAHF 標(biāo)志寄存器傳送,把AH內(nèi)容裝入標(biāo)志寄存器.
    PUSHF 標(biāo)志入棧.
    POPF 標(biāo)志出棧.
    PUSHD 32位標(biāo)志入棧.
    POPD 32位標(biāo)志出棧.

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

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

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

XOR 異或運(yùn)算.
OR 或運(yùn)算.
3)、串操作指令

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

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

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

寄存器尋址
mov bx,ax

存儲(chǔ)器尋址分為如下:
直接尋址
mov ax,[2000h] 默認(rèn)ds段
mov ax,es:[2000h]

寄存器相對(duì)尋址
mov ax,[di+06]

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

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

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

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

7、說(shuō)說(shuō)你理解的棧是什么?
答:一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),一種存儲(chǔ)數(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.在串操作指令前使用重復(fù)前綴指令REPE,終止串的重復(fù)操作條件是 cx為零或zf為零

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

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

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

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

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

  1. CPU 要訪問(wèn)的某一存儲(chǔ)單元的實(shí)際地址稱 物理地址

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

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

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

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

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

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

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

4.inc 指令會(huì)影響哪些標(biāo)志位?
答:inc指令會(huì)影響的標(biāo)志位有SF ZF PF AF OF

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

6.cmps 指令會(huì)影響哪些標(biāo)志位?
答:AF、CF、OF、SF、PF、ZF。

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

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

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

10.已知eax=1,ecx=2,運(yùn)行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指令后會(huì)執(zhí)行哪些操作?執(zhí)行POPA指令后會(huì)執(zhí)行哪些操作?
壓入8 個(gè)通寄存器,順序?yàn)?EAXECXEDXEBXESPEBPESEDPOPA 和以上:相反,EDI 開始到EAX 結(jié)束

13.已知cf 標(biāo)志位為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,符號(hào)位SF=0,執(zhí)行指令cmp eax,200,后eax= 100 ,sf=1

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

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

把??臻g初始化為CC

18.C 語(yǔ)言的函數(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.已知一個(gè)整形變量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 和匯編語(yǔ)言有什么關(guān)系?
答:OPCode與匯編指令并非是單純的對(duì)應(yīng)關(guān)系,同一opcode對(duì)應(yīng)的匯編指令不一定相同,反之也一樣。

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

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

3.填空題

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

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

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

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

  2. 創(chuàng)建操作數(shù)類型描述,常見操作數(shù)大小描述,請(qǐng)說(shuō)明:
    常見操作數(shù)類型編碼和大小描述
    a 兩個(gè)單字內(nèi)存操作數(shù)或兩個(gè)雙字內(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 位緊縮雙精度浮點(diǎn)數(shù)
    pi 四字 MMX 寄存器(如 mm0)
    ps 128 位緊縮單精度浮點(diǎn)數(shù)
    q 四字操作數(shù),不論操作數(shù)尺寸屬性
    s 6 字節(jié)或 10 字節(jié)偽描述符(pseudo-descriptor)
    ss 128 位緊縮單精度浮點(diǎn)數(shù)的標(biāo)量部分(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 域?yàn)閇--][--]時(shí),表示什么意思:
SIB字節(jié)

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

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

4.擴(kuò)展題
請(qǐng)?jiān)趇ntel 手冊(cè)中查找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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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