《匯編語(yǔ)言》課后習(xí)題解答_第1頁(yè)
《匯編語(yǔ)言》課后習(xí)題解答_第2頁(yè)
《匯編語(yǔ)言》課后習(xí)題解答_第3頁(yè)
《匯編語(yǔ)言》課后習(xí)題解答_第4頁(yè)
《匯編語(yǔ)言》課后習(xí)題解答_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1章基礎(chǔ)知識(shí)

檢測(cè)點(diǎn)1.1(第9頁(yè))

(1)1個(gè)CPU的尋址能力為8KB,那么它的地址總線的寬度為色位。

(2)1KB的存儲(chǔ)器有3個(gè)存儲(chǔ)單元,存儲(chǔ)單元的編號(hào)從g到些。

(3)1KB的存儲(chǔ)器可以存儲(chǔ)8192(273)個(gè)bit,1024個(gè)Byte。

(4)1GB是1073741824(2"30)個(gè)Byte、1MB是1048576(2"20)個(gè)Byte.1KB是1024

(2"10)個(gè)Byteo

(5)8080.8088、80296、80386的地址總線寬度分別為16根、20根、24根、32根,貝U它

們的尋址能力分別為:64(KBX1(MBX16(MBX4(GB卜

(6)8080.8088、8086、80286、80386的數(shù)據(jù)總線寬度分另!I為8根、8根、16根、16根、

32根。則它們一次可以傳送的數(shù)據(jù)為:[(B),1(BX2(BX2(BX4(B

(7)從內(nèi)存中讀取1024字節(jié)的數(shù)據(jù),8086至少要讀些次,80386至少要讀物次。

(8)在存儲(chǔ)器中,數(shù)據(jù)和程序以二進(jìn)制形式存放。

1

解題過(guò)程:

A

(1)1KB=1024B,8KB=1024B*8=2N,N=13o

(2)存儲(chǔ)器的容量是以字節(jié)為最小單位來(lái)計(jì)算的,1KB=1024Bo

(3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit卜

(4)1GB=1073741824B(即2A30)1MB=1048576B(即2"20)1KB=1024B(即2A10卜

(5)一個(gè)CPU有N根地址線,則可以說(shuō)這個(gè)CPU的地址總線的寬度為No這樣的CPU

最多可以尋找2的N次方個(gè)內(nèi)存單元。(一個(gè)內(nèi)存單元=1Byte卜

(6)8根數(shù)據(jù)總線一次可以傳送8位二進(jìn)制數(shù)據(jù)(即一個(gè)字節(jié)b

(7)8086的數(shù)據(jù)總線寬度為16根(即一次傳送的數(shù)據(jù)為2B)1024B/2B=512,同理

1024B/4B=256o

(8)在存儲(chǔ)器中指令和數(shù)據(jù)沒(méi)有任何區(qū)別,都是二進(jìn)制信息。

2

第2章寄存器

檢測(cè)點(diǎn)2.1(第19頁(yè))

(1)寫出每條匯編指令執(zhí)行后相關(guān)寄存器中的值。

第一空:F4A3H

第二空:31A3H

第三空:3123H

第四空:6246H

第五空:826CH

第六空:6246H

第七空:826CH

第八空:04D8H

第九空:0482H

第十空:6C82H

第H?一空:D882H

第十二空:D888H

第十三空:D810H

第十四空:6246H

3

(2)只能使用目前學(xué)過(guò)的匯編指令,最多使用4條指令,編程計(jì)算2的4次方。

解答如下:

movax,2

addax,ax

addax.ax

addax,ax

檢測(cè)點(diǎn)2.2(第25頁(yè))

(1)OOO1OH,1OOOFH

(2)1001H,2000H

因?yàn)槎蔚钠鹗嫉刂芬獮?6的倍數(shù)。所以當(dāng)段地址小于1001H或大于2000H時(shí)

(1)解題過(guò)程:

物理地址=$慶*16+£慶

EA的變化范圍為Oh~ffffh

物理地址范圍為(SA*16+0h)~(SA*16+ffffh)

現(xiàn)在SA=0001h,那么尋址范圍為

(0001h*16+0hH0001h*16+ffffh)

=0010h~1000fh

4

(2)解題過(guò)程:

物理地址=$人*16+£人

20000h=SA*16+EA

SA=(20000h-EA)/16=2000h-EA/16

EA取最大值時(shí),SA=2000h-ffffh/16=1001h,SA為最小值

EA取最小值時(shí),SA=2000h-0h/16=2000h,SA為最大值

這里的ffffH/16=fffh是通過(guò)WIN自帶計(jì)算器算的

按位移來(lái)算確實(shí)應(yīng)該為fff.fh,這里小數(shù)點(diǎn)后的f應(yīng)該是省略了

單就除法來(lái)說(shuō),應(yīng)有商和余數(shù),但此題要求的是地址最大和最小,所以余數(shù)忽略了

如果根據(jù)位移的算法(段地址*16=16進(jìn)制左移一位),小數(shù)點(diǎn)后應(yīng)該是不能省略的

我們可以反過(guò)來(lái)再思考下,如果SA為1000h的話,小數(shù)點(diǎn)后省略

SA=1000h,EA取最大ffffh,物理地址為Iffffh,將無(wú)法尋到20000H單元

這道題不應(yīng)看成是單純的計(jì)算題

5

檢測(cè)點(diǎn)2.3(第35頁(yè))

答:CPU修改了4次IP的值。

情況如下:

第1次:執(zhí)行完movax,bx后

第2次:執(zhí)行完subax,ax后:該步執(zhí)行后,寄存器ax清零

第3次:讀入jmpax后

第4次:執(zhí)行完jmpax后;連續(xù)兩步ip均為0

最后IP的值為0

;最后IP的值為0000H,因?yàn)樽詈骯x中的值為0000H,所以IP中的值也為0000H

6

第三章寄存器(內(nèi)存訪問(wèn))

檢測(cè)點(diǎn)3.1(第55頁(yè))

⑴(題目:略)

第一空:2662H

第二空:E626H

第三空:E626H

第四空:2662H

第五空:D6E6H

第六空:FD48H

第七空:2C14H

第八空:0000H

第九空:00E6H

第十空:0000H

第H■一空:0026H

第十二空:OOOCH

提示:此題可在DEBUG中利用E命令在本機(jī)上按照題目中所給出的內(nèi)存單元及其數(shù)據(jù)進(jìn)

行相應(yīng)地修改,然后再用A命令進(jìn)行寫入(題目中所給出的)相應(yīng)的匯編指令,最后再進(jìn)行T

命令進(jìn)行逐步執(zhí)行,以查看相應(yīng)結(jié)果。

7

c(C:\¥Iin)O¥S\syste>32\cBd.exe-debug

—e0000"0000

0000:000068.7010.80A7.F000.308B.EF01.6070.3000.E2

0000:000816.0000.809E.8003.128B.6601.2070.2200.60

0000:00108B.6201.2670.E600.D6B9.CC06.2E10.3C02.3B

0-0r00a:X001840.AB07.BA10.0002.00FF.2603.0610.6602.88

AX00

:0000

-rbX

BX00

-i*cs

CS0AF7

:1000

-rip

IP0100

:0000

AX=0000BX=0000CX=0000D]X=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0AF7ES=0AF7SS=0AF7?CS=1000IP=0000NUUPEIPLNZNAPONC

1000:00000000ADD[BX+SILALDS:0000=CD

-a1000:0

1000:0000

100000nouax,l

100003nouds,ax

100005mouax,[0000]

100008noubx,[000U

10000cnouax,bx

10000Enouax,[0000]

100011moubx,[0002]

100015addax^bx

100017addax,[0004]

10001Bnouax,0

10001Enoual,[0002]

100021noubx,0

100024noubl,[000CJ

100028addal,bl

10002A

c<C:\¥IliD01S\systeB32\cB(i.exe-debug

AX=2662BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF7CS=1000IP=0008NUUPEIPLNZNAPONC

4000:00088B1E0100MOUBX,[000UDS:0001=E626

AX=2662BX=E626CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF7CS=1000IP=000CNUUPEIPLNZNAPONC

1000:000089D8MOUAX-BX

-t

AX=E626BX=E626CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF?CS=1000IP=000ENUUPEIPLNZNAPONC

1000:000EA10000MOUAX.[0000]DS:0000=2662

pt

AX=2662BX=E626CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF?CS=1000IP=0011NUUPEIPLNZNAPONC

hl000:00118B1E0200MOUBX,[00021DS:0002=D6E6

AX=2662BX=D6E6CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF7CS=1000IP=0015NUUPEIPLNZNAPONC

4.000:001501D8ADDAX.BX

8

cTC:\HND01S\systeB32\cBd.exedebug-口X

AX=FD48BX=D6E6CX=0000DX=0000SP=FFEEBP=000081=0000DI=0000

DS=0001ES=0AF7SS=0AF7CS=1000IP=0017NUUPEINGNZNAPENC

1000:0017'03060400ADD?AX,[0004]DS:0004=2ECC

-t

AX=2C14BX=D6E6CX=0000DX=0000SP=FFEEBP=0000SI-0000DI=0000

DS=0001ES=0AF7SS=0AF?CS=1000IP=001BNUUPEIPLNZACPECV

1000:001E:B80000MOUAX,0000

-t

AX=0000BX=D6E6CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF7CS=1000IP=001ENUUPEIPLNZACPEC¥

1000:001E:A00200MOUAL,[0002]DS:0002=E6

-t

AX=00E6BX=D6E6CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF7CS=1000IP=0021NUUPEIPLNZACPEGV

1000:0021BB0000MOUBX,0000

pt

AX=00E6BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF7CS=1000IP=0024NUUPEIPLNZACPECV

1000:0024:8A1E0C00MOUBL.C000C]DS:000c=26

AX=00E6BX=0026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0001ES=0AF7SS=0AF7CS=1000IP=0028NUUPEIPLNZACPECY

1000:002800D8ADDAL,BL

-t

AX=000CBX=0026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

pS=0001ES=0AF7SS=0AF7CS=1000IP=002ANUUPEIPLNZNAPECV

1000:002A0000ADD[BX+SI],ALDS:0026=9E

(2)指令序列如下:

movax,6622h

jmpOffO:O1OO

movax,2000h

movds,ax

movax,[0008]

movax,[0002]

9

2.寫出CPU執(zhí)行每條指令后,CS、IP和相關(guān)寄存器中的數(shù)值。

指令序列寄存器fcsIPDSAXBX

初始值f2000H00001000H00

movax,6622h2000H00031000H6622H0000

jmpOffO:O1OO1000H00001000H6622H0000

movax,2000h1000H00031000H2000H0000

movds,ax1000H00052000H2000H0000

movax,[0008]1000H00082000HC389H0000

movax,[0002]1000H000B2000HEA66H0000

3.再次體會(huì):數(shù)據(jù)和程序有區(qū)別嗎?如何確定內(nèi)存中的信息哪些是數(shù)據(jù),哪些是程序?

檢測(cè)點(diǎn)3.2(第70頁(yè))

(1沿全下面的程序使其可以將10000H-1000FH中的8個(gè)字逆序拷貝至42OOOOH-2OOOFH

中。

movax,1000H

movds,ax

movax,2000H

movss,ax

movsp,10h

10

(2部全下面的程序使其可以將10000H-1000FH中的8個(gè)字逆序拷貝至U20000H-2000FH

中。

movax,2000H

movds,ax

movax,1000H

movss,ax

movsp,0

11

檢測(cè)點(diǎn)6.1(第129頁(yè))

(1)下面的程序?qū)崿F(xiàn)依次用內(nèi)存0:0?0:15單元中的內(nèi)容改寫程序中的數(shù)據(jù),完成程序:

assumecs:codesg

codesgsegment

dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

start:movax,0

movds,ax

movbx,0

movex,8

s:movax,[bx]

movcs:[bx],ax

addbx,2

loops

movax,4c00h

int21h

codesgends

endstart

12

(2)下面的程序?qū)崿F(xiàn)依次用內(nèi)存0:0?0:15單元中的內(nèi)容改寫程序中的數(shù)據(jù),數(shù)據(jù)的傳送用

棧來(lái)進(jìn)行。棧空間設(shè)置在程序內(nèi)。完成程序:

assumecs:codesg

codesgsegment

dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

dw0,0,0,0,0,0,0,0,0,0

;10個(gè)字單元用作??臻g,所以棧空間的大小為10*2=20,化成16進(jìn)制即為14

start:movax,codesg;或movax,cs

movss,ax

movsp,24hmovsp,36;10h+14h=24h

movax,0

movds,ax

movbx,0

movex,8

s:push[bx]

popcs:[bx];或popss:[bx];關(guān)鍵在于cs與ss此時(shí)地址相同

addbx,2

loops

movax,4c00h

int21h

codesgends

endstart

13

檢測(cè)點(diǎn)9.1(第183頁(yè))

(1)程序如下:

assumecs:code

datasegment

dw2dup(0)

dataends

codesegment

start:movax,data

movds,ax

movbx,0

jmpwordptr[bx+1]

codeends

endstart

若要使jmp指令執(zhí)行后,CS:IP指向程序的第一條指令,在data段中應(yīng)該定義哪些數(shù)據(jù)?

14

答案①db3dup(0)

答案②dw2dup(0)

答案③dd0

jmpwordptr[bx+1]為段內(nèi)轉(zhuǎn)移,要CS:IP指向程序的第一條指令,應(yīng)設(shè)置ds:[bx+1]的字單

元(2個(gè)字節(jié))存放數(shù)據(jù)應(yīng)為0,貝”(ip尸ds:[bx+1]=0

簡(jiǎn)單來(lái)說(shuō)就是,只要ds:[bx+1]起始地址的兩個(gè)字節(jié)為0就可以了

15

(2)程序如下:

assumecs:code

datasegment

dd12345678h

dataends

codesegment

start:movax,data

movds,ax

movbx,0

mov[bx],bx;或mov[bx],wordptr0;或mov[bx],offsetstart

mov[bx+2],cs;或mov[bx+2],cs;或mov[bx+2],segcode

jmpdwordptrds:[O]

codeends

endstart

補(bǔ)全程序,使用jmp指令執(zhí)行后,CS:IP指向程序的第一條指令。

16

第一格可填①mov[bx],bx(2)mov[bx],wordptr0(3)mov[bx],offsetstart等。

第二格可填①mov[bx+2],cs②mov[bx+2],cs③mov[bx+2],segcode等。

解析:

jmpdwordptrds:[0]為段間轉(zhuǎn)移,(cs)=(內(nèi)存單元地址+2),(ip)=(內(nèi)存單元地址),要CS:IP指

向程序的第一條指令,第一條程序地址cs:0,應(yīng)設(shè)置CS:IP指向cs:0

程序中的mov[bx],bx這條指令,是將ip設(shè)置為0

mov[bx+2],cs,將cs這個(gè)段地址放入內(nèi)存單元

執(zhí)行后,cs應(yīng)該不變,只調(diào)整ip為0,(ip)=ds:[O]=O

(3)用Debug查看內(nèi)存,結(jié)果如下:

2000:1000BE0006000000……

則此時(shí),CPU執(zhí)行指令:

movax,2000h

moves,ax

jmpdwordptres:[1000h]

后,(cs尸0006H,(ip)=OOBEH

17

解析:

jmpdwordptr為段間轉(zhuǎn)移,高位存放段地址,低位存放偏移地址

(cs)=(內(nèi)存單元地址+2),(ip)=(內(nèi)存單元地址)

根據(jù)書P16,對(duì)于寄存器AX,AH為高位(前1字節(jié)為高位),AL為低位(后1字節(jié)為低位)

推算出(內(nèi)存單元地址)=00BEH,(內(nèi)存單元地址+2)=0006H

根據(jù)書P182,高位存放段地址(后2個(gè)字節(jié)為高位),低位存放偏移地址(前2個(gè)字節(jié)為低位)

(cs)=(內(nèi)存單元地址+2),(ip)=(內(nèi)存單元地址)

推算出(cs)=0006H,(ip)=00BEH.

檢測(cè)點(diǎn)9.2(第184頁(yè))

補(bǔ)全編程,利用jcxz指令,實(shí)現(xiàn)在內(nèi)存2000H段中查找第一個(gè)值為0的字節(jié),找到后,將它

的偏移地址存儲(chǔ)在dx中。

18

assumecs:code

codesegment

start:movax,2000h

movds,ax

movbx,0

s:movch,0

movcl,[bx]

jcxzok;當(dāng)cx=0時(shí),CS:IP指向OK

incbx

jmpshorts

ok:movdx,bx

movax,4c00h

int21h

codeends

endstart

19

檢測(cè)點(diǎn)9.3(第185頁(yè))

補(bǔ)全編程,利用loop指令,實(shí)現(xiàn)在內(nèi)存2000H段中查找第一個(gè)值為0的字節(jié),找到后,將

它的偏移地址存儲(chǔ)在dx中。

assumecs:code

codesegment

start:movax,2000h

movds,ax

movbx,0

s:movcl,[bx]

movch,0

incex;只要保證cx>0,才能執(zhí)行l(wèi)oop循環(huán),切記!

incbx

loops

ok:decbx

movdx,bx

movax,4c00h

int21h

codeends

endstart

20

檢測(cè)點(diǎn)10.1(第191頁(yè))

補(bǔ)全程序,實(shí)現(xiàn)從內(nèi)存1000:0000處開(kāi)始執(zhí)行指令。

assumecs:code

stacksegment

db16dup(0)

stackends

codesegment

start:movax,stack

movss,ax

movsp,16

movax,1000h

pushax

movax,0

pushax

retf

codeends

endstart

21

執(zhí)行reft指令時(shí),相當(dāng)于進(jìn)行:

Popip

popcs

根據(jù)棧先進(jìn)后出原則,應(yīng)先將段地址CS入棧,再將偏移地址ip入棧。

檢測(cè)點(diǎn)10.2(第192頁(yè))

下面的程序執(zhí)行后,ax中的數(shù)值為多少?

內(nèi)存地址機(jī)器碼匯編指令執(zhí)行后情況

1000:0b80000movax,0ax=0ip指向1000:3

1000:3e80100callsPOPiPip指向1000:7

1000:640incax

1000:758s:popaxax=6

用debug進(jìn)行跟蹤確認(rèn)「call標(biāo)號(hào)”是將該指令后的第一個(gè)字節(jié)偏移地址入棧,再轉(zhuǎn)到標(biāo)

號(hào)處執(zhí)行指令。

22

檢測(cè)點(diǎn)10.3(第192頁(yè))

下面的程序執(zhí)行后,ax中的數(shù)值為多少?

內(nèi)存地址機(jī)器碼匯編指令執(zhí)行后情況

1000:0b80000movax,0ax=0,ip指向1000:3

1000:39a09000010callfarptrspopcs,popip,ip指向1000:9

1000:840incax

1000:958s:popaxax=8h

addax,axax=10h

popbxbx=1000h

addax,bxax=1010h

檢測(cè)點(diǎn)10.4(第194頁(yè))

下面的程序執(zhí)行后,ax中的數(shù)值為多少?

內(nèi)存地址機(jī)器碼匯編指令執(zhí)行后情況

1000:0b80600movax,6ax=6,ip指向1000:3

1000:3ffdOcallaxpopip,ip指向1000:6

1000:540incax

1000:658movbp,spbp=sp=fffeh;棧頂?shù)牡刂窚p去2,存放著05h

addax,[bp]ax=[6+ds:(fffeh)]=6+5=0bh

23

用debug進(jìn)行跟蹤確認(rèn):'callax(16位reg)”是先將該指令后的第一個(gè)字節(jié)偏移地址ip入棧,

再轉(zhuǎn)到偏移地址為ax(16位reg)處執(zhí)行指令。

編譯無(wú)法通過(guò),只能理論分析.

c\C:\¥INDO¥S\syste?i32\c>d.exe-debug

,osoftWindowsXPLUersion5.1.2600]

Copyright1985-2001MicrosoftCorp.

::\DocunentsandSettings\Admmstratoi*>ug

ugiisnotrecognizedasaninternalorexternalcommand.

perableprogramorbatchfile.

:'DocumentsandSettings\Hdmnistrator/debug

-a1000:0

1000:0000nouax,6

1000:0003callax

L000:0005incax

1000:0006noubp,sp

L000:0008addax,[bp]

L000:000B

-d1000:0FA0473

1000:0000B80600FFD04089E5-034600AB8031031E

L000:001003B02BAA80FA06?3-0D80E201743C0274

L000:0020174AB84449ABA0A9-560AC07409C3B02B

1000:00300DE824FF03DAB05D-AA89IE8B56EBBC03

L000:0040AAE8D8FEEBEE8B1E-0B4AB84258068356

1000:0050IE154AB85349EBCD-E899FD9803FD8AD0

L000:0060928AC6E8C5FE8AC2-E9C0FEE886E802FF

1000:0070E881FD8AF0031683-56EBE62407

QS\¥INDO¥S\systeB32\cad.exe-debug

Pa1000:0

1000:0000nouax,6

1000:0003callax

1000:0005incax

1000:0006noubp,sp

1000:0008addax,[bp]

1000:000B

AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

PS=1378ES=1378SS=1378CS=1378IP=0100NUUPEIPLNZNAPONC

1378:01000000ADDEBX+SILALDS:0000=CD

-i*cs

CS1378位?子系統(tǒng)

:100016S-DOS

Hrip

IP0100C:WINDOWS\system32\cmd.exe-debug

:0000NTVDMCPU遇到無(wú)效的指令.

CS:OddcIP:0006OP:fOfeIdfOde選擇“關(guān)閉”終止應(yīng)用程序。

AX=0006BX=000l=0000

PS=1378ES=13?10NC

1000:0003FFD0

AX=0006BX=0000CX=0000DX=0000SP=FFECBP=0000SI=0000DI=0000

j)S=13?8ES=1378SS=1378CS=1000IP=0006NUUPEIPLNZNAPONC

1000:000689E5MOUBP,SP

24

檢測(cè)點(diǎn)10.5(第195頁(yè))

(1)下面的程序執(zhí)行后,ax中的數(shù)值為多少?

assumecs:code

stacksegment

dw8dup(0)

stackends

codesegment

start:movax,stack

movss,ax

movsp,16

movds,ax

movax,0

callwordptrds:[Oeh]

incax

incax

incax

movax,4c00h

int21h

25

codeends

endstart

Note:Pressq<orQ')andEntertoquitdebugnode?

ruU

2932:0000B83129UAX,2931

2932:00038EDOUSS,AX

2932:0005BC1000USP,0010

2932:00088ED8UDS,AX

2932:000AB80000LAX,0000

2932:000DFF160E00C[000E]

2932:001140CAX

2932:001240CAX

2932:001340UAX

2932:0014B8004CTAX,4c00

2932:0017CD21D21

2932:0019229A0074DBL,[BP+SI+7400]

2932:001D05F6C7AX,C7F6

當(dāng)程序執(zhí)行callwordptrds:[0EH]語(yǔ)句時(shí),相當(dāng)于進(jìn)行:

1:PUSHIP(此時(shí)IP的值為CALL語(yǔ)句下一條語(yǔ)句的偏移地址,也就是INCAX的偏移地址)

2:JMPWORDPTRSS(因?yàn)镈S等于SS):[0EH],此時(shí)程序跳轉(zhuǎn)至!]CS:SS:[OEH]處執(zhí)行,因

為SS:[0EH]的值為0,所以跳轉(zhuǎn)到CS:0處開(kāi)始執(zhí)行,也就是程序的第一條語(yǔ)句MOVAX,

STACK,當(dāng)程序再一次執(zhí)行到callwordptrds:[0EH]時(shí),又進(jìn)行上面的兩步,但是此時(shí)

SS:[OEH]的值已經(jīng)不是0了,而是上一次執(zhí)行PUSHIP時(shí),壓入的IP的值,而這個(gè)IP正是

CALL語(yǔ)句下一條語(yǔ)句的偏移地址,也就是INCAX的偏移地址.所以程序跳轉(zhuǎn)到語(yǔ)句INCAX

處執(zhí)行,所以AX的值為3.

26

(2)下面的程序執(zhí)行后,ax和bx中的數(shù)值為多少?

assumecs:codesg

stacksegment

dw8dup(O)

stackends

codesgsegment

start:

movax,stack

movss,ax

movsp,1Oh

movwordptrss:[0],offsets;(ss:[0])=1ah

movss:[2],cs;(ss:[2])=cs

calldwordptrss:[0];cs入棧,ip=19h入棧,轉(zhuǎn)到cs:1ah處執(zhí)行指令

;ss:[0ch]=19hss:[0eh]=cs

nop

s:movax,offsets;ax=1ah

subax,ss:[0ch];ax=1ah-(ss:[0ch])=1ah-19h=1

movbx,cs;bx=cs=0c5bh

subbx,ss:[0eh];bx=cs-cs=0

27

movax,4c00h

int21h

codesgends

endstart

C:\TIND0YS\systeB32\coBMand.COB-|g|x|

:Pressq<orQ>andEntei*'toquitdebugnode?

-uAx21

:0000B83129MOss,A9X3

:00038EDOMOsp,00

:0005BC1000MO,01

:000836ss

:0009C70600001A00MOWORDPTR[0000L001A

:000F36ss

:00108C0E0200MO[0002],CS

:001436ss

:0015FF1E0000cfiFAR[0000]

:001990NO

:001AB81A00MOAX,001A

:001D36ss

:001E2B060c00suAX/000C]

28

檢測(cè)點(diǎn)11.1(第216頁(yè))

寫出下面每條指令執(zhí)行后,ZF、PF、SF、等標(biāo)志位的值。

subal,alal=0hZF=1PF=1

SF=O

moval,1al=1h;mov指令不改變標(biāo)志位ZF=1PF=1

SF=O

pushaxax=1h;push指令不改變標(biāo)志位ZF=1PF=1

SF=O

popbxbx=1h;pop指令不改變標(biāo)志位ZF=1PF=1

SF=0

addal,blal=2h;al=00000010bZF=0PF=0

SF=0

addal,10al=12h;al=00001010bZF=0PF=1

SF=0

mulalax=144h;ax=10010000bZF=0PF=1

SF=0

29

檢測(cè)點(diǎn)11.2(第219頁(yè))

寫出下面每條指令執(zhí)行后,ZF、PF、SF、CF、OF等標(biāo)志位的值。

alCFOFSFZFPF

subal,alOh00000000b00011

moval,10h10h00100000b00011

addal,90haOh10100000b00101

moval,80h80h10000000b00101

addal,80hOh00000000b11011

moval,OfchOfch11111100b11011

addal,05h1h00000001b10000

moval,7dh7dh11111101b10000

addal,Obh88h10001000b01101

檢測(cè)點(diǎn)涉及的相關(guān)內(nèi)容:

CF是flag的第。位,進(jìn)位標(biāo)志位,記錄無(wú)符號(hào)運(yùn)算結(jié)果是否有進(jìn)/借位,結(jié)果有進(jìn)/借位時(shí),SF=1

OF是flag的第11位,溢出標(biāo)志位,記錄有符號(hào)運(yùn)算結(jié)果是否溢出,結(jié)果溢出時(shí),0F=1

正數(shù)相加超出127,負(fù)數(shù)相加超出-128,兩種情況OF均置為1

SF是flag的第7位,符號(hào)標(biāo)志位,記錄有符號(hào)運(yùn)算結(jié)果是否為負(fù)數(shù),結(jié)果為負(fù)數(shù)時(shí),SF=1

ZF是flag的第6位,零標(biāo)志位,記錄指令執(zhí)行后結(jié)果是否為0,結(jié)果為0時(shí),ZF=1

PF是flag的第2位,奇偶標(biāo)志位,記錄指令執(zhí)行后結(jié)果二進(jìn)制中1的個(gè)數(shù)是否為偶數(shù),結(jié)果為偶數(shù)時(shí),PF=1

add、sub、mukdiv、inc、or、and等運(yùn)算指令影響標(biāo)志寄存器

30

mov、push、pop等傳送指令對(duì)標(biāo)志寄存器沒(méi)影響。

檢測(cè)點(diǎn)11.3(第229頁(yè))

(1)補(bǔ)全下面的程序,統(tǒng)計(jì)F000:0處32個(gè)字節(jié)中,大小在[32,128]的數(shù)據(jù)個(gè)數(shù)。

movax.OfOOOh

movds,ax

movbx,0;ds:bx指向第一個(gè)字節(jié)

movdx,0;初始化累加器

movex,32

s:moval,[bx]

empal,32;和32進(jìn)行比較

jbsO;如果低于al轉(zhuǎn)到sO,繼續(xù)循環(huán)

empal,128;和128進(jìn)行比較

jasO;如果高于al轉(zhuǎn)到sO,繼續(xù)循環(huán)

incdx

sO:incbx

loops

31

⑵補(bǔ)全下面的程序,統(tǒng)計(jì)F000:0處32個(gè)字節(jié)中,大小在(32,128)的數(shù)據(jù)個(gè)數(shù)。

movax.OfOOOh

movds,ax

movbx,0;ds:bx指向第一個(gè)字節(jié)

movdx,0;初始化累加器

movex,32

s:moval,[bx]

empal,32;和32進(jìn)行比較

jnasO;如果不高于al轉(zhuǎn)到sO,繼續(xù)循環(huán)

empal,128;和128進(jìn)行比較

jnbsO;如果不低于al轉(zhuǎn)到sO,繼續(xù)循環(huán)

incdx

sO:incbx

loops

32

[32,128]是閉區(qū)間,包括兩端點(diǎn)的值

(32,128)是開(kāi)區(qū)間,不包括兩端點(diǎn)的值

檢測(cè)點(diǎn)11.4(第233頁(yè))

下面指令執(zhí)行后,(ax)=45h

movax,0

pushax

popf;將psw清零

movax.OfffOH

addax,001Oh

pushf;將psw入棧,psw的值000000001000101,這里已經(jīng)講學(xué)過(guò)的標(biāo)志位都標(biāo)

識(shí)出來(lái)了,沒(méi)學(xué)過(guò)的全部都當(dāng)作0分析了,結(jié)果應(yīng)該也是對(duì)的

popax;出棧ax的值就是0000000001000101

andal,11000101B;且運(yùn)算al:01000101

andah,00001000B;且運(yùn)算al:00000000

分析:這里面主要還是講解pushf和popf,就是psw的值入棧,psw16個(gè)字節(jié),我們學(xué)習(xí)

33

了6個(gè),但是df在本程序里面一直沒(méi)有賦值,所以是0,其他的標(biāo)志位沒(méi)有學(xué)習(xí),在下面的

且運(yùn)算的時(shí)候全部歸零了,所以最后的結(jié)果就是0045H,也就是最后我分析的00000000

01000101c

檢測(cè)點(diǎn)12.1(第238頁(yè))

⑴用debug查看內(nèi)存,情況如下:

0000:00006810A7008B017000-16009D038B017000

則3號(hào)中斷源對(duì)應(yīng)的中斷處理程序入口的偏移地址的內(nèi)存單位的地址為:0070:018b

Q)

34

存儲(chǔ)N號(hào)中斷源對(duì)應(yīng)的中斷處理程序入口的偏移地址的內(nèi)存單元的地址為:4N

存儲(chǔ)N號(hào)中斷源對(duì)應(yīng)的中斷處理程序入口的段地址的內(nèi)存單元的地址為:4N+2

檢測(cè)點(diǎn)涉及相關(guān)內(nèi)容:

一個(gè)表項(xiàng)存放一個(gè)中斷向量,也就是一個(gè)中斷處理程序的入口地址,這個(gè)入口地址包括段地

址和偏移地址,一個(gè)表項(xiàng)占兩個(gè)字,高地址存放段地址,低地址存放偏移地址

檢測(cè)點(diǎn)13.1(第257頁(yè))

(1)7ch中斷例程如下:

Ip:pushbp

movbp,sp

decex

jexzIpret

add[bp+2],bx

Ipret:popbp

iret

(1)在上面的內(nèi)容中,我們用7ch中斷例程實(shí)現(xiàn)loop的功能,則上面的7ch中斷例程所能進(jìn)

行的最大轉(zhuǎn)移位移是多少?

35

最大位移是FFFFH,即棧底與棧頂之間的位移為最大轉(zhuǎn)移位移

可以轉(zhuǎn)移的范圍是-32768-32767

(2)用7ch中斷例程完成jmpnearptrs指令功能,用bx向中斷例程傳送轉(zhuǎn)移位移。

應(yīng)用舉例:在屏幕的第12行,顯示data段中以。結(jié)尾的字符串。

assumecs:code

datasegment

db'conversation,,0

dataends

codesegment

start:

movax,data

movds,ax

movsi,0

movax,0b800h

moves,ax

movdi,12*160

s:cmpbyteptr[si],0

jeok

moval,[si]

moves:[di],al

36

incsi

adddi,2

movbx,offsets-offsetok

int7ch

ok:movax,4c00h

int21h

codeends

endstart

jmpnearptrs指令的功能為:(ip戶(ip)+16位移,實(shí)現(xiàn)段內(nèi)近轉(zhuǎn)移

assumecs:code

codesegment

start:

movax,cs

movds,ax

movsi,offsetdoO;設(shè)置ds:si指向源地址

movax,0

moves,ax

movdi,200h;設(shè)置es:di指向目標(biāo)地址

movex,offsetdoOend-offsetdoO;設(shè)置ex為傳輸長(zhǎng)度

cld;設(shè)置傳輸方向?yàn)檎?/p>

37

repmovsb

movax,0

mo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論