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ù)傳輸指令
- 通用數(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 ) - 輸入輸出端口傳送指令.
IN I/O端口輸入. ( 語(yǔ)法: IN 累加器, {端口號(hào)│DX} )
OUT I/O端口輸出. ( 語(yǔ)法: OUT {端口號(hào)│DX},累加器 )
輸入輸出端口由立即方式指定時(shí), 其范圍是 0-255; 由寄存器 DX 指定時(shí),其范圍是 0-65535. - 目的地址傳送指令.
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. - 標(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.填空選擇題
- 指令指針寄存器是 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
- 在VS DEBUG 模式下反編譯的程序中EBP 中存放的是 十六進(jìn)制數(shù)據(jù)
15.在字符串操作指令中,DS : ESI 指向源串,ES : DSI 指向目的串。
CPU 要訪問(wèn)的某一存儲(chǔ)單元的實(shí)際地址稱 物理地址
循環(huán)控制指令LOOPNZ/LOOPNE 控制循環(huán)繼續(xù)執(zhí)行的條件是 CX=0 且ZF=0
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)的匯編指令不一定相同,反之也一樣。
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ī)范指定。所有不同架構(gòu)的CPU 都有自己的OPCode 嗎?
答:可能是自己的也可能和其他一樣。
3.填空題
- OPCode 為0xCC 匯編語(yǔ)言代碼為 int 3 ,OPCode 為0X50 匯編語(yǔ)言代碼為 push eax
- 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 -- 鎖定前綴
切換操作數(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創(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