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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第1章基礎知識

檢測點1.1(第9頁)

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

(2)1KB的存儲器有3個存儲單元,存儲單元的編號從g到些。

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

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

(2"10)個Byteo

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

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

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

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

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

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

1

解題過程:

A

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

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

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

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

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

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

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

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

1024B/4B=256o

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

2

第2章寄存器

檢測點2.1(第19頁)

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

第一空:F4A3H

第二空:31A3H

第三空:3123H

第四空:6246H

第五空:826CH

第六空:6246H

第七空:826CH

第八空:04D8H

第九空:0482H

第十空:6C82H

第H?一空:D882H

第十二空:D888H

第十三空:D810H

第十四空:6246H

3

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

解答如下:

movax,2

addax,ax

addax.ax

addax,ax

檢測點2.2(第25頁)

(1)OOO1OH,1OOOFH

(2)1001H,2000H

因為段的起始地址要為16的倍數(shù)。所以當段地址小于1001H或大于2000H時

(1)解題過程:

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

EA的變化范圍為Oh~ffffh

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

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

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

=0010h~1000fh

4

(2)解題過程:

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

20000h=SA*16+EA

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

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

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

這里的ffffH/16=fffh是通過WIN自帶計算器算的

按位移來算確實應該為fff.fh,這里小數(shù)點后的f應該是省略了

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

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

我們可以反過來再思考下,如果SA為1000h的話,小數(shù)點后省略

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

這道題不應看成是單純的計算題

5

檢測點2.3(第35頁)

答: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,因為最后ax中的值為0000H,所以IP中的值也為0000H

6

第三章寄存器(內存訪問)

檢測點3.1(第55頁)

⑴(題目:略)

第一空:2662H

第二空:E626H

第三空:E626H

第四空:2662H

第五空:D6E6H

第六空:FD48H

第七空:2C14H

第八空:0000H

第九空:00E6H

第十空:0000H

第H■一空:0026H

第十二空:OOOCH

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

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

命令進行逐步執(zhí)行,以查看相應結果。

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和相關寄存器中的數(shù)值。

指令序列寄存器fcsIPDSAXBX

初始值f2000H00001000H00

movax,6622h2000H00031000H6622H0000

jmpOffO:O1OO1000H00001000H6622H0000

movax,2000h1000H00031000H2000H0000

movds,ax1000H00052000H2000H0000

movax,[0008]1000H00082000HC389H0000

movax,[0002]1000H000B2000HEA66H0000

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

檢測點3.2(第70頁)

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

中。

movax,1000H

movds,ax

movax,2000H

movss,ax

movsp,10h

10

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

中。

movax,2000H

movds,ax

movax,1000H

movss,ax

movsp,0

11

檢測點6.1(第129頁)

(1)下面的程序實現(xiàn)依次用內存0:0?0:15單元中的內容改寫程序中的數(shù)據,完成程序:

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)下面的程序實現(xiàn)依次用內存0:0?0:15單元中的內容改寫程序中的數(shù)據,數(shù)據的傳送用

棧來進行。??臻g設置在程序內。完成程序:

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進制即為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];關鍵在于cs與ss此時地址相同

addbx,2

loops

movax,4c00h

int21h

codesgends

endstart

13

檢測點9.1(第183頁)

(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段中應該定義哪些數(shù)據?

14

答案①db3dup(0)

答案②dw2dup(0)

答案③dd0

jmpwordptr[bx+1]為段內轉移,要CS:IP指向程序的第一條指令,應設置ds:[bx+1]的字單

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

簡單來說就是,只要ds:[bx+1]起始地址的兩個字節(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

補全程序,使用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]為段間轉移,(cs)=(內存單元地址+2),(ip)=(內存單元地址),要CS:IP指

向程序的第一條指令,第一條程序地址cs:0,應設置CS:IP指向cs:0

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

mov[bx+2],cs,將cs這個段地址放入內存單元

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

(3)用Debug查看內存,結果如下:

2000:1000BE0006000000……

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

movax,2000h

moves,ax

jmpdwordptres:[1000h]

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

17

解析:

jmpdwordptr為段間轉移,高位存放段地址,低位存放偏移地址

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

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

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

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

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

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

檢測點9.2(第184頁)

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

的偏移地址存儲在dx中。

18

assumecs:code

codesegment

start:movax,2000h

movds,ax

movbx,0

s:movch,0

movcl,[bx]

jcxzok;當cx=0時,CS:IP指向OK

incbx

jmpshorts

ok:movdx,bx

movax,4c00h

int21h

codeends

endstart

19

檢測點9.3(第185頁)

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

它的偏移地址存儲在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

檢測點10.1(第191頁)

補全程序,實現(xiàn)從內存1000:0000處開始執(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指令時,相當于進行:

Popip

popcs

根據棧先進后出原則,應先將段地址CS入棧,再將偏移地址ip入棧。

檢測點10.2(第192頁)

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

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

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

1000:3e80100callsPOPiPip指向1000:7

1000:640incax

1000:758s:popaxax=6

用debug進行跟蹤確認「call標號”是將該指令后的第一個字節(jié)偏移地址入棧,再轉到標

號處執(zhí)行指令。

22

檢測點10.3(第192頁)

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

內存地址機器碼匯編指令執(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

檢測點10.4(第194頁)

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

內存地址機器碼匯編指令執(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進行跟蹤確認:'callax(16位reg)”是先將該指令后的第一個字節(jié)偏移地址ip入棧,

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

編譯無法通過,只能理論分析.

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遇到無效的指令.

CS:OddcIP:0006OP:fOfeIdfOde選擇“關閉”終止應用程序。

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

檢測點10.5(第195頁)

(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

當程序執(zhí)行callwordptrds:[0EH]語句時,相當于進行:

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

2:JMPWORDPTRSS(因為DS等于SS):[0EH],此時程序跳轉至!]CS:SS:[OEH]處執(zhí)行,因

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

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

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

CALL語句下一條語句的偏移地址,也就是INCAX的偏移地址.所以程序跳轉到語句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入棧,轉到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

檢測點11.1(第216頁)

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

subal,alal=0hZF=1PF=1

SF=O

moval,1al=1h;mov指令不改變標志位ZF=1PF=1

SF=O

pushaxax=1h;push指令不改變標志位ZF=1PF=1

SF=O

popbxbx=1h;pop指令不改變標志位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

檢測點11.2(第219頁)

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

alCFOFSFZFPF

subal,alOh00000000b00011

moval,10h10h00100000b00011

addal,90haOh10100000b00101

moval,80h80h10000000b00101

addal,80hOh00000000b11011

moval,OfchOfch11111100b11011

addal,05h1h00000001b10000

moval,7dh7dh11111101b10000

addal,Obh88h10001000b01101

檢測點涉及的相關內容:

CF是flag的第。位,進位標志位,記錄無符號運算結果是否有進/借位,結果有進/借位時,SF=1

OF是flag的第11位,溢出標志位,記錄有符號運算結果是否溢出,結果溢出時,0F=1

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

SF是flag的第7位,符號標志位,記錄有符號運算結果是否為負數(shù),結果為負數(shù)時,SF=1

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

PF是flag的第2位,奇偶標志位,記錄指令執(zhí)行后結果二進制中1的個數(shù)是否為偶數(shù),結果為偶數(shù)時,PF=1

add、sub、mukdiv、inc、or、and等運算指令影響標志寄存器

30

mov、push、pop等傳送指令對標志寄存器沒影響。

檢測點11.3(第229頁)

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

movax.OfOOOh

movds,ax

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

movdx,0;初始化累加器

movex,32

s:moval,[bx]

empal,32;和32進行比較

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

empal,128;和128進行比較

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

incdx

sO:incbx

loops

31

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

movax.OfOOOh

movds,ax

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

movdx,0;初始化累加器

movex,32

s:moval,[bx]

empal,32;和32進行比較

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

empal,128;和128進行比較

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

incdx

sO:incbx

loops

32

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

(32,128)是開區(qū)間,不包括兩端點的值

檢測點11.4(第233頁)

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

movax,0

pushax

popf;將psw清零

movax.OfffOH

addax,001Oh

pushf;將psw入棧,psw的值000000001000101,這里已經講學過的標志位都標

識出來了,沒學過的全部都當作0分析了,結果應該也是對的

popax;出棧ax的值就是0000000001000101

andal,11000101B;且運算al:01000101

andah,00001000B;且運算al:00000000

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

33

了6個,但是df在本程序里面一直沒有賦值,所以是0,其他的標志位沒有學習,在下面的

且運算的時候全部歸零了,所以最后的結果就是0045H,也就是最后我分析的00000000

01000101c

檢測點12.1(第238頁)

⑴用debug查看內存,情況如下:

0000:00006810A7008B017000-16009D038B017000

則3號中斷源對應的中斷處理程序入口的偏移地址的內存單位的地址為:0070:018b

Q)

34

存儲N號中斷源對應的中斷處理程序入口的偏移地址的內存單元的地址為:4N

存儲N號中斷源對應的中斷處理程序入口的段地址的內存單元的地址為:4N+2

檢測點涉及相關內容:

一個表項存放一個中斷向量,也就是一個中斷處理程序的入口地址,這個入口地址包括段地

址和偏移地址,一個表項占兩個字,高地址存放段地址,低地址存放偏移地址

檢測點13.1(第257頁)

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

Ip:pushbp

movbp,sp

decex

jexzIpret

add[bp+2],bx

Ipret:popbp

iret

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

行的最大轉移位移是多少?

35

最大位移是FFFFH,即棧底與棧頂之間的位移為最大轉移位移

可以轉移的范圍是-32768-32767

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

應用舉例:在屏幕的第12行,顯示data段中以。結尾的字符串。

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位移,實現(xiàn)段內近轉移

assumecs:code

codesegment

start:

movax,cs

movds,ax

movsi,offsetdoO;設置ds:si指向源地址

movax,0

moves,ax

movdi,200h;設置es:di指向目標地址

movex,offsetdoOend-offsetdoO;設置ex為傳輸長度

cld;設置傳輸方向為正

37

repmovsb

movax,0

mo

溫馨提示

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

評論

0/150

提交評論