IBM-PC匯編語言程序設(shè)計(第二版)課后習(xí)題答案_第1頁
IBM-PC匯編語言程序設(shè)計(第二版)課后習(xí)題答案_第2頁
IBM-PC匯編語言程序設(shè)計(第二版)課后習(xí)題答案_第3頁
IBM-PC匯編語言程序設(shè)計(第二版)課后習(xí)題答案_第4頁
IBM-PC匯編語言程序設(shè)計(第二版)課后習(xí)題答案_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

IBM-PC匯編語言程序設(shè)計(第二版)課后習(xí)題答案(清華大學(xué)出

版社)(沈美明,溫冬蟬著)答案

第三章答案1-22

1.

(1)立即尋址沒有

(2)直接尋址7237H

(3)使用BX的寄存器尋址沒有

(4)使用BX的間接尋址637DH

(5)使用BX的寄存器相對尋址0D5F0H

(6)基址變址尋址8E18H

(7)相對基址變址004FH

2.根據(jù)下列要求,寫出相應(yīng)的匯編指令。

(1)ADDDX,BX

(2)ADDAL,[BX][SI]

(3)ADD[BX][0B2II],CX

(4)MOVAX,2A59HADD[0524H],AX

(5)ADI)AL,0B5H

3.

(1)寄存器間接尋址

MOVBX,OFFSET[BLOCK][OAH]

MOVDX,[BX]

(2)寄存器相對尋址

MOVSI,OAH

MOVDX,[BLOCK][SI]

(3)基址變址尋址

MOVBX,BLOCK

MOVSI,OAH

MOVDX,[BX][SI]

4.現(xiàn)有(DS)=2000H,(BX)-OIOOH,(SD=0002H,(20100)=12H,(20101)=34H,(20102)=56H,

(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,試說明下列各條指令執(zhí)行完

后,AX寄存器的內(nèi)容。

(1)MOVAX,1200111200H

(2)MOVAX,BX01OOH

(3)MOVAX,[1200]4C2AH注意,是字單元

(4)MOVAX,[BX]同上

(5)MOV1100EBX]4C2AH

(6)MOVAX,[BX][SI]7856H

(7)MOVAX,1100[BX][SI]65B7H

5.(1)7CD9H(2)1200H(3)6319H

6.MOVBX,2000H

LESDI,[BX]

MOVAX,ES:DI

7.轉(zhuǎn)向地址OBJ的值分別為:(1)064DH(2)0691H(3)05E0H

注意有符號數(shù)的符號位

8.(1)MOVAX,OABH立即數(shù)尋址無物理地址

(2)MOVAX,BX寄存器尋址同上

(3)MOVAX,[100]直接尋址20100II

(4)MOVAX,VAL直接尋址20050II

(5)MOVAX,[BX]寄存器間接尋址20100H

(6)MOVAX,ES:[BX]直接尋址21100H

(7)MOVAX,[BP]寄存器間接尋址20010H

(8)MOVAX,[SI]同上200A0II

(9)MOVAX,[BX+10]寄存器相對尋址20110H

(10)MOVAX,VAL[BX]同上20150H

(11)MOVAX,[BX][SI]基址變址尋址201A0H

(12)MOVAX,VAL[BX][SI]相對基相變址尋址201F0H

9.(1)的指令:MOVAX,[BX][OCH]MOVZREO,AX

(2)的指令:MOVAX,ARRAY[BX]MOVZREO,AX

10.MOVAX,TABLE是把符號地址TABLE里的內(nèi)容送到AX里,指令執(zhí)行完后,(AX)=123411

LEAAX,TABLE是把符號地址TABLE的有效地址(這里是偏移量)送到指定寄存器AX里,

指令執(zhí)行完后,(AX)=0032H

11.執(zhí)行完指令后,(AX)=1EOOII

12.LEAAX,CSTRING

MOVDL,AX

MOVDH,[AX+6]

13.這參考課本P51—P53

14.LESBX,[2000]

MOVAX,ES:[BX]

15.運算結(jié)果SF,ZF,CF,OF各位的值(從左至右依次往下、)

(1)74D4H0000

⑵A5C1H1001

⑶4240H0010

(4)0000H0110

16.接上表~

⑴5D140000

⑵\8701001

⑶D8701000

(4)34E40010

17.

(l).MOVAX,Z;把Z送到AX

SUBAX,X;z-x

ADDAX,W;w+(z-x)

MOVZ,AX;結(jié)果保存在z中

(2).MOVAX,R;R送到AX中

ADDAX,9;R+9

MOVBX,X;X送到BX中

ADDBX,6;X+6

ADDAX,BX;(R+9)+(X+6),結(jié)果保存在AX中

MOVBX,W;W送到BX中

SUBBX,AX;W-(R+9)-(X+6),連續(xù)減去兩個數(shù),相當(dāng)于減去這兩個數(shù)的和

MOVZ,BX;最終結(jié)果送到Z中

(3)

MOVAX,W;把W送到AX

IMULX;W*X注意:低十六位保存在AX里,高十六位保存在DX里

MOVBX,Y把Y送到BX里

ADDBX,6Y+6

IDIVBX;(W*X)/(Y+6)注意:商保存在AX里,余數(shù)保存在DX里

MOVZ,AX?把商送到Z中,

MOVR,DX把余數(shù)送到R中

(4)

MOVAX,W;把W送至IJAX中

SUBAX,X;W-X

CWD;把AX中的十六位帶符號數(shù)擴展成為32位,低十六位保存在AX中,高十六位

保;在DX中

MOVBX,5;把5送到BX中

IDIVBX;(W-X)/5被除數(shù)為32位,除數(shù)為16位商為16位

IMULY:上一步結(jié)果再乖以Y,積為32位

MOVBX,2:把2送到BX中

IMULBX;上一步乘法所得的積再乘以2,各為64位

MOVZ,EAX;把結(jié)果中低32位放入Z雙字單元中

MOV[Z+4],EDX;把結(jié)果中高32位放入Z+4雙字單元中

18.

指令本條指令執(zhí)行完后AX的內(nèi)容執(zhí)行完后CF,SF,ZF的值

MOVAX,1234H1234H000

MOVCL,41234H000

ROLAX,CL2341H100

DECAX2340H100

MOVCX,42340H100

MULCX8918H000

INT20H

程序結(jié)束后,(AX)=891811(DX)=000011

19.

指令執(zhí)行完后AX的內(nèi)容執(zhí)行完后CF,SF,ZF和OF的值

MOVAX,000010

DECAXFFFFH0100

ADDAX,7FFFH7FFEH0000

ADDAX,28000II0101

NOTAX7FFFH0101

SUBAX,OFFFFH8000H1101

ADDAX,8000H0000H1011

SUBAX,1FFFFH1101

ANDAX,58D1II58D1H0000

SALAX,1B1A2H0101

SARAX,1D8D1H0100

NEGAX272FH1000

RORAX,19397H1001

20.

(1)MOVAX,DATAX

ADDDATAY,AX

(2)MOVAX,DATAX

ADDDATAY,AX

MOVAX,[DATAX+2]

ADD[DATAY+2],AX

(3)本條且指令的作用是:BX<------[DATAX]+[DATAY]+[1](CF的值)帶暹位加法~

(4)MOVAX,DATAX

MULDATAY;余吉果的高十六位保存在DX裹,低十六位保存在AX裹

(5)MOVAX,DATAX

MOVDX,[DATAX+2]

MULDWORDDATAY;;

(6)MOVAX,DATAX

DIV17H;結(jié)果商保存在AL中,余數(shù)在AH中

(7)MOVAX,DATAX

CDW

DIVDATAY

21.NEGDX

NEGAX

SBBDX,0

22.

MOVAX,A;把曼字?jǐn)?shù)的低字放到AX中

MOVDX,[A+2];把曼字房數(shù)的高字放到DX中

TESTDX,800011;字房數(shù)的符虢

JZRIGHT;如果是非負數(shù),即直接保存

NEGDX;如果是負數(shù),即求衲

NEGAX

SBBDX,0

RIGHT:MOVB,AX

MOV[B+2],DX

23.每僚指令單褐軌行完彳笈的結(jié)果依次卷:

(1)9AH(2)61H(3)OFBH(4)1CH(5)0(6)0E3H

24.軌行指令序列彳笈,BX的內(nèi)容卷:ODAH

25.

(1)把53D乘以2的程序:

MOVAX,35H;53D=35H

SHLAX,1

(2)把53除以2的程序:

MOVAX,35H

SHRAX,1

其他的同理~~

26.il段程序完成的功能是:把DX:AX中的曼字?jǐn)?shù)撼左移4位(相常於乘以16D)

27.各修指令^^^行彳奏,DX的值依次卷:

(1)5CH(2)17H(3)05C8H(4)72H(5)2017H(6)OCDH(7)0172H(8)05CCH(9)

ODCH

28.^程序段軌行完彳爰,BX寄存器的內(nèi)容是:C02DH

29.(1)從左到右把CONMAE中的字符串偉送到PRUNE的程序?qū)崿F(xiàn):

LEASI,CONAME;把CONAME中第一個字節(jié)的偏移地址送到SI中

LEADI,PRUNE;把PRLINE中第一個字節(jié)的偏移地址送到DI中

MOVCX,20;把重復(fù)次數(shù)放到CX里

CLD;讓SIDI從低地址指向高地址(即從左到右傳送)

REPMOVSB;傳送

(2)從右到左把CONMAE中的字符串傳送到PRLINE中的程序?qū)崿F(xiàn):

LEASI,CONAME

LEADI,PRLINE

MOVCX,20

STD;和上面唯一不同的就是這次是從右到左,所以要從高地址指向低地址

REPMOVSB

(3)把CONAME中的第三和第四f0字^裝入AX的程序^現(xiàn):

LEASI,[CONAME+3]

LODSW

(4)把AX寄存器的內(nèi)容存入優(yōu)PRLINE+5日目始的字套。中的程序

LEADI,[PRLINE+5]

STOSW

(5)檢查CONAME字符串中有瓢空格字符,如有把它僮:送給BH寄存器的程序

LEADI,CONAME;把CONAME中第一值1字符偏移地址放入DI中

MOVCX,20;把重^次數(shù)放到CX中

MOVAL,20H;把空格符的ASCII值放入AL中

CLD;從低到高

REPNESCASB;比敕

MOVBH,[DI-1]R;把檢查到的空格符送到BH中

30.

MOVCX,12H;把重^次數(shù)放到CX中。道凄用十六暹制表示

MOVSI,0;初始化SI

MOVAX,2611;把&字符的ASCH值放入AX

CHECK:CMPAX,STRINGtSl];依次查找

INCSI

LOOPNECHECK:找到了就退出

MOVAX,20H;把空格符的ASCII值勤放入AX中

MOVSTRING[SI-1],AX;用空格符代替&

31。(1)用空格符清除PRINTLINE域的程序?qū)崿F(xiàn):

MOVAL,20H

LEADI,PRINTLINE

MOVCX,132

CLD

REPSTOSB

(2)在STUDENT_ADDR中查找第一個'_'的程序?qū)崿F(xiàn):

MOVAX,2DH;把“一”的ASCH值放入AX

MOVSI,0;初始化SI

MOVCX,9;把重禊次數(shù)放入CX中

;依次檢查STUDENT-ADDR中的字符是否卷"_",找到第一個停下來

CHECK:CMPAX,STUDENT_ADDR[SI];

INCSI;

LOOPNZCHECK;

(3)在STUDENT.ADDR中查找最后一個”「的程序?qū)崿F(xiàn):

;和第二題不同的就是道次是優(yōu)右到左查前,所以SI的初始化卷9

MOVAX,2DII;

MOVSI,9;

MOVCX,9;

CHECK:CMPAX,STUDENT-ADDR[SI]

DECSI;

LOOPNZCHECK;

(4)程序

MOVAL,2011;把空格符的ASCH值放入AL中

LEADI,STUDENT_NAME;把STUDENT_NAME中第一個字符偏移地址放到DI中

MOVCX,30;把重復(fù)次數(shù)放到CX中

CLD;讓DI從低位移到高位

REPZSCASB;如果有不是空格符的,就退出

JZSTORE;如果全是空格符,就轉(zhuǎn)到STORE中

;用*代替空格

STORE:MOVAL2AH

MOVCX,30

STD;注意,這里是把前面從低到高移動的DI再從高到低移上去”

REPSTOSB

(5)程序?qū)崿F(xiàn):

;把STUDENT_NAME移到PRINTLINE的前30個字節(jié)中

LEASI,STUDENT_NAME

LEADI,PRINT_LINE

MOVCX,30

CLD

REPMOVSB;把STUDENT_ADDR移至ijPRINT_LINE的后9個字節(jié)中

LEASI,[STUDENT_ADDR+9]

LEADI,[PRINT_LINE+132]

MOVCX,9

STD

REPMOVSB

32.程序?qū)崿F(xiàn):

LEASI,OLDS

LEADI,NEWS

MOVCX,5

REPZCMPSB

JNZNEWLESS

33.

(1)CMPDX,CX

JAEXCEED

(2)CMPBX,AX

JGEXCEED

(3)CMPCX,0

JZZERO

(4)CMPBX,AX

JOOVERFLOW

(5)CMPBX,AX

JLEEQ_SMA

(6)CMPDX,CX

JBEEQ_CX

34.(1)跳轉(zhuǎn)到:LI

(2)跳轉(zhuǎn)到LI

(3)跳轉(zhuǎn)到L2

(4)跳轉(zhuǎn)到L5

(5)跳轉(zhuǎn)到L5

35.

(1)可以引起轉(zhuǎn)移到L1的指令有:NB,BE,NL,LE

(2)可以引起轉(zhuǎn)移到L1的指令有:同上

(3)可以引起轉(zhuǎn)移到L1的指令有:B,BE,L,LE

(4)可以引起轉(zhuǎn)移到L1的指令有:NB.NBE.NL,NLE

(5)可以引起轉(zhuǎn)移到L1的指令有:同上

(6)可以引起轉(zhuǎn)移到L1的指令有:同(3)

(7)可以引起轉(zhuǎn)移到L1的指令有:同上

36o

37.程序流程圖就不畫了,程序如下~~

MOVAL,STAUSESI];把要測試的字節(jié)放到AL中

ANDAL,2AH;把第一,三,五位為一其他位為。的數(shù)一2AH,與這個字節(jié)比較,結(jié)果放到AL

JZR0UTINE_4;如果結(jié)果為0,則三位都為0

XORAL,2AH;前面相與的結(jié)果再與2AH異或

JZROUTINE_1;如果結(jié)果為0,則三位都為1

BSFBL,AL;

BSRBL,AL

CMPBL,CL

;如果向前和向后測試后,第一個1的位置相同,說明只有一個1,則異或運算前有AL中有兩個1

JER0UTINE_2

ROUTINE_1

注:本題還有其他解法,請大家自己試試s

38.(1)當(dāng)括號內(nèi)是:LOOP時,循環(huán)四次,程序結(jié)束后

(AX)=05(BX)=16(CX)=0(DX)=0

(2)當(dāng)括號內(nèi)是:LOOPE時,不循環(huán),程序結(jié)束后

(AX)=02(BX)=04(CX)=03(DX)=02

(3)當(dāng)括號內(nèi)是:LOOPNE時:循環(huán)三次,程序結(jié)束后

(AX)=04(BX)=11(CX)=01(DX)=0

第四章答案

1。下列指令的錯誤

(1)MOVAH,BX源操作數(shù)與目的操作數(shù)長度不相同~

(2)MOV[BX],[SI]這是兩個內(nèi)存單元在傳遞數(shù)據(jù),而這在匯編語言中是不允許的~~~

(3)MOVAX,[SI][DI]不能用兩個變址連用,其中一個應(yīng)為基址~

(4)MOVMYDAT[BX][SI],ES:AX同(2)

(5)MOVBYTEPTR[BX],1000必須有一個為寄存器

(6)MOVBX,OFFSETMYDAT[SI]OFFSET不能與復(fù)雜操作數(shù)相連~

(7)MOVCS,AX不能對CS賦值~

(8)MOVECX,AX操作數(shù)類型不同~

2。(1)合法(2)非法(3)非法(4)非法

3。(1)非法,操作數(shù)類型不同

(2)合法

(3)非法,不允許兩個內(nèi)存單元直接傳遞數(shù)據(jù),你把人家CPU放哪了?~~~呵~

(4)合法~

(5)合法~

(6)合法

(7)非法必須有一個寄存器把CPU放哪了?~~

(8)非法,兩個內(nèi)存單元地址相加沒有意義~

(9)合法

(10)非法,同(3)

4。(1)兩內(nèi)存單元傳遞數(shù)據(jù)

(2)操作數(shù)類型不同

(3)跳轉(zhuǎn)指令只能跳轉(zhuǎn)到符號地址

(4)轉(zhuǎn)移指令后不能為變量,只能為標(biāo)號

(5)格式不對,應(yīng)為NEARPTRo<,o

5。圖,就不畫了~~

6o(1)DW5150H

(2)MOVAX,5150H

MOVADDRESS,AX;等,寫出幾個就可以~~

7。DATASGSEGMENT

FLD1BDB'personalcomputer'

FLD2BDB10DUP(32)

FLD3BDB20H

FLD4BDB01011001B

FLD5BDB'32654,

FLD6BDB10DUP(0)

FLD7BDB'PARTI',DUP20(?),,PART2,,DUP50(?),'PART3',DUP14(?)

FLD1WDWOFFFOH

FLD2WDW01011001B

FLD3WDWFLD7B

FLD4WDW5,6,7,8,9

FLD5WDW5DUP(0)

FLD6WDW(FLD6W-FLD1W)-(FLD7B-FLD1B)

80PLENTH的值為22,GE表示該數(shù)據(jù)段的長度?

9OL的值為7

10o(1)MOVAX,OFFSETLNAME

(2)MOVSI,WORDPTRCODE_LIST

(3)CODE_LENGHTEQU$-CODE_LIST

llo代碼如下:

DATA_SEGSEGMENT

DB5

DATA_LISTDWOFFFFH,0,2,5,4,5DUP(?)

DATA_SEGENDS

CODE_SEGSEGMENT

ASSUMECS:CODE_SEG,DS:DATA_SEG

MOVAX,5

MOVMAX,AX

MOVAX,OFFFFH

MOVMIN,AX

CODE_SEGENDS

12o(1)10025

(2)19

(3)2548

(4)3

(5)103

(6)OFFFFH

(7)1

(8)3

13。分別匯編成為:

MOVAX,OAH

MOVBL,OAH

MOVCL,1

14。(1)(AX)=1(2)(AX)=2(3)(CX)=14H(4)(DX)=32H(5)(CX)=1]

15?(1)操作符錯誤改為:DATA_SEGSEGMENT

(2)缺少段名在前面加個段名

(3)引用應(yīng)該從;開始把那個“/”改成“;”

(4)結(jié)構(gòu)混亂改為:

MAIN_PROCPROCFAR

MAIN_PROCENDP

END

16。程序框架如下:

DATA_SEGSEGMENT;定羲數(shù)撼段

ORGOEOOOH;^下一字第地址卷OEOOOH

FIRST_TYPEEQUTHISWORD;建立一值I輿下一存^^元有相同段地址和偏移地址的操作

數(shù)

DATA_GROUPDB100DUP(?);DATA_GROUP分配100低1字的空^

DATA_SEGENDS:數(shù)摞段結(jié)束

STACK_SEGSEGMENT;定羲堆梭段

ALIGN16;18下一字第優(yōu)小段首地址^始

STACKDB100DUP(?);卷堆慢分配空

STACK_SEGENDS;

CODE_SEGSEGMENT

ASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG

ORG1000H;^下脩指令的第一俯I字^彳能1000H^始

START:MOVAX,DATA_SEG

MOVDS,AX

MOVAX,STACK_SEG

MOVSS,AX

CODESEGENDS

ENDSTART;幺吉束?

17。程序如下:

D_SEGSEGMENT;數(shù)據(jù)段定義

AUGENC)DD99251

D_SEGENDS

E_SEGSEGMENT;附加段定義

ADDENDDD-15926

E_SEGENDS

C_SEGSEGMENT;代碼段定義

ASSUMECS:C_SEG,DS:D_SEG,ES:E_SEG

START:MOVAX,DSEG

第五章答案

5.1試編寫一個匯編語言程序,要求對鍵盤輸入的小寫字母用大寫字母顯示出來

.modelsmall

.stack10011

.code

mainprocfar

Start:

pushdx

movax,0

pushax

movah,01H

int21H

cmpal,61H

jllopl

cmpal,7BII

jgelopl

subal,2OH

movdl,al

lopl:movah,2

int21H

ret

Endstart

5.2編寫一個程序,從鍵盤接受一個小寫字母,然后找出它的前導(dǎo)字符和后續(xù)字符,再按順序顯示

這三個字符.

.modelsmall

.386

.code

MAINPROCFAR

start:

pushds

subax,ax

pushax

input:

movah,7H

int21H

cmpe:cmpal,20H

JEexit

cmpal,6111

JLinput

cmpal,7AH

JGinput

print:

subal,01H

movdl,al

movah,02H

int21H

addal,01H

movdl,al

movah,02H

int21H

addal,01H

movdl,al

movah,02H

int2111

;輸出換行回車

movdl,OAH

movah,02H

int21H

jmpinput

exit:

ret

MAINENDP

ENDstart

5.3將AX寄存器中的16位數(shù)分成4組,每組4位,然后把這四組數(shù)分別放在AL、BL、CL、DL中。

.modelsmall

.data

xDB4dup(?)

.stack100H

.code

MAINPROCFAR

start:

pushds

andax,OOH

pushax

movax,1234H

movex,04H

movsi,OOH

lop:

pushex

movcl,04H

rolax,cl

pushax

andal,OFH

movBYTEPTRx[si],al

popax

popex

addsi,2

Looplop

moval,[X]

movbl,[X+2]

movcl,[X+4]

movdl,[X+6]

print:

movah,0211

int21H

movdl,al

movah,02H

int21H

movdl,bl

movah,02H

int21H

movdl,cl

movah,02H

int21H

exit:

ret

MAINENDP

ENDstart

5.4編寫一個程序,要求比較兩個字符串STRING1和STRING2所含字符是否相同,若相同則顯示

“MATCH”,若不同在顯示:〃NOMATCH"o

.modelsmal1

.data

STRING1DB'Imuststudyhard'

STRING2DBTmuststudyhard)

XDB'MATCH.$'

YDB'NOMATCH.$'

.stack100H

.code

mainprocfar

Start:

pushdx

movax,0

pushax

movax,?data

movds,ax

moves,ax

leasi,STRINGl

leadi,STRING2

cld

movex,(string2-stringl)/typeSTRING2

ret

Endstart

5.5編寫一個程序,要求能從鍵盤接收一個個位數(shù)N,然后響鈴N次,(響鈴的ASCH為07)。

這題比較有意思,呵呵。

modelsmall

.code

mainprocfar

start:

pushds

subax,ax

pushax

input:

movah,01H

int2III

cmpal,20H

jeexit

cmpal,30H

jleinput

cmpal,3AH

jgeinput

subal,30H

movex,ax

andex,OFFH

lop:movdl,07H

movah,211

int21H

looplop

jmpinput

exit:ret

mainendp

endstart

5.6編寫程序,將一個包含有20個數(shù)據(jù)的數(shù)組M分成兩個數(shù)組:正數(shù)數(shù)組和負數(shù)數(shù)組N,并分別把

這兩個數(shù)組中的數(shù)據(jù)個數(shù)顯示出來。

.modelsmall

.386

.data

MDB1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10

PDB20dup(?)

NDB20dup(?)

.code

MAINPROCFAR

start:

PUSHds

ANDax,0

PUSHax

MOVax,?data

movds,ax

MOVbx,0

MOVsi,0

MOVdi,0

MOVex,20D

empe:CMPM[bx],0

JLifLow

hight:MOVal,byteptrM[bx]

MOVbyteptrP[si],al

incsi

JMPcommonContrl

ifLow:

MOVal,byteptrM[bx]

MOVbyteptrN[di],al

INCdi

commonContrl:

INCbx

loopempe

movax,si

callshowNumber

callprintCR

movax,di

callshowNumber

exit:ret

MAINENDP

;;;;;;;;;;;;;;;;;注意,ShowNumber這個子過程有問題,請自行修改;;;;

showNumberPROCNEAR

covernum:

DAA

MOVdx,ax

MOVcl,2II

show:

ROLdl,4H

pushdx

ANDdl,OfH

ADDdl,30H

MOVah,02H

int21H

popdx

loopshow

ret

showNumberENDP

printCRPROCNEAR

movdl,OaH

movah,02H

int21H

movdl,OdH

movah,02H

int21H

ret

printCRENDP

endstart

5.7編制?個匯編語言程序,求出首地址為DATA的100D字?jǐn)?shù)組中的最小偶數(shù),并把它放在AX"」。

此題根據(jù)題意要求應(yīng)該使用完整匯編格式,因為精簡格式也使用DATA....

dataaresegment

DATADW3322H,4555H,200H,3544H,1245H

numDB($-DATA)/2

dataareends

codesegment

assumecs:code,ds:dataare

MAINPROCFAR

start:

pushds

movax,Oil

pushax

movax,dataare

movds,ax

movdx,OH;偶數(shù)數(shù)量計數(shù)

movex,Wordptr[num]

movsi,OH

isO:

movbx,WORDPTRDATA[si]

shrbx,1H

jncaddDX

jmpcommonControl

addDX:

ADDdx,1H

empdx,1H

jefirstAXValue

compare:

movbx,WORDPTRDATA[si]

empbx,ax

jgecommonControl

movax,bx

commonControl:

ADDsi,2H

loopisO

jmpexit

firstAXvalue:

movax,WORDPTRDATA[si]

jmpcompare

exit:

ret

MAINENDP

codeends

ENDstart

5.8沒有做。。

5.9編寫一個匯編語言程序,要求從鍵盤上接收一個思維的十六位進制數(shù),并在終端上顯示與它等

值的二進制數(shù)。

.modelsmal1

.386

.code

mainprocfar

start:

pushds

movax,0

pushax

movax,0

movex,4

movdx,0

input:

movah,1H

int21H

empal,30H

jlinput

empal,39H

jles

empal,6111

jlinput

empal,66H

jginput

subal,27H

s:

subal,3011

adddl,al

empex,1H

jef

roldx,4

f:

loopinput

exit:

callprint

ret

mainendp

printprocnear

movex,10H

P:

roldx,1

pushdx

anddx,1

adddx,30H

movah,2

int21H

popdx

loopp

ret

printendp

endstart

5.10設(shè)有一段英文,其變量字符名為ENG,并以$字符結(jié)束。試編寫一程序,查對單詞SUN在該文中

的出現(xiàn)次數(shù),并以格式〃SUNXXXX〃顯示出次數(shù)。

.modelsmall

.386

.data

ENGdb'SUN'sSUNJAVA',24H;;;;24H=$

MESSAGEdb'SUN:','$'

.stack100II

.code

MAINPROCFAR

start:

PUSHDS

ANDAX,0

PUSHAX

MOVAX,?data

MOVDS,AX

MOVAX,OH

MOVSI,1H

subSIl:

SUBSI,1H

subSI2:

SUBSI,1H

compares:

ADDSI,1H

MOVDL,ENG[SI]

CMPDL,24H

JEprint

CMPDL,53H

JNEcompares

compareU:

ADDSI,1H

MOVDL,ENG[SI]

CMPDL,55H

JNEsubSI2

compareN:

ADDSI,1H

MOVDL,ENG[SI]

CMPDL,4EH

JNEsubSIl

INCAX

JMPcompares

print:

LEADX,MESSAGE

PUSHAX

MOVAH,09H

INT21H

POPAX

callshowNumber

exit:

ret

MAINENDP

;;;;;;;;;;;;;;;;;注意,ShowNumber這個子過程有問題,請自行修改;;;;;;;;;;;;;;;;

showNumberPROCNEAR

covernum:

DAA

MOVdx,ax

MOVcl,4H

show:

ROLdx,4H

pushdx

ANDdx,0fH

ADDdx,30H

MOVah,02H

int21H

popdx

loopshow

ret

showNumberENDP

ENDstart

5.11從鍵盤輸入一系列以$為結(jié)束副的字符串,然后對其中的非數(shù)字字符計數(shù),并顯示出計數(shù)結(jié)果。

.modelsmall

.386

.code

MAINPROCFAR

start:

pushds

movax,0

pushax

movex,0

input:

movah,1H

int21H

compare:

empal,24H

jeprint

empal,30H

jladdCount

empal,39H

jgaddCount

addCount:

addax,III

jmpinput

print:

callshowNumber

exit:ret

MAINENDP

;;;;;;;;;;;;;;;;;注意,ShowNumber這個子過程有問題,請自行修改;;;;

showNumberPROCNEAR

covernum:

DAA

MOVdx,ax

MOVcl,2H

show:

ROLdl,4H

pushdx

ANDdl,OfH

ADDdl,30H

MOVah,02H

int21H

popdx

loopshow

ret

showNumberENDP

ENDstart

5.12有一個首地址為MEM的100D字?jǐn)?shù)組,試編制程序刪除數(shù)組中所有為零的項,并將后續(xù)項向前

壓縮,最后將數(shù)組的剩余部分補上零。

.modelsmal1

.386

.stack10OH

.data

memdw

12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0

,2,54,0,12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2

,0,2,4,0,2,54,0,45,7,5,1,2,0,2,4,0,2

.code

MAINPROCFAR

start:

pushds

andax,0

pushax

movax,?data

movds,ax

movax,OH

movbx,64H

movex,64H

movsi,OFFFEH

repeat:

ADDsi,2H

empMEM[si],0II

JEcalls

looprepeat

calls:

INCax

callsort

cmpax,1H

JElastValue

DECex

jmprepeat

exit:

ret

lastValue:

movmem[bx],OH

DECex

jmprepeat

MAINENDP

sortPROCNEAR

pushex

pushsi

subsi,2H

s:addsi,2H

movdx,mem[si]

movmem[si+2],dx

loops

return:

popsi

popex

ret

sortENDP

ENDstart

MOVAX,E_SEG

MOVES,AX

MOVEAX,DS:AUGEND

ADDEAX,ES:ADDEND

MOVDS:SUM,EAX

C_SEGENDS

ENDSTART:結(jié)束

18o

19o需要加上PTR偽操作的有:(2)(3)(4)

第六章答案

2、答:(1)NAME1NAMELIST<>

(2)MOVAX,DATA;假設(shè)結(jié)構(gòu)變量NAME1定義在數(shù)據(jù)段DATA中

MOVDS,AX

MOVES,AX

MOVAH,10

LEADX,NAME1

INT21H

MOVCL,NAME1.ACTLEN

MOVCH,0

LEASI,NAME1.NAMEIN

LEADI,DISPFILE

CLD

REPMOVSB

6、答:SKIPLINESPROCNEAR

PUSHCX

PUSHDX

MOVCX,AX

NEXT:MOVAH,2

MOVDL,OAH

INT21H

MOVAH,2

MOVDL,ODH

INT21H

LOOPNEXT

POPDX

POPCX

RET

SKIPLINESENDP

7、答:

dsegsegment

numdw76,69,84,90,73,88,99,63,100,80

ndw10

s6dw0

s7dw0

s8dw0

s9dw0

s10dw0

dsegends

codesegment

mainprocfar

assumecs:code,ds:dseg

start:

pushds

subax,ax

pushax

movax,dseg

movds,ax

callsub1

ret

mainendp

sub1procnear

pushax

pushbx

pushex

pushsi

movsi,0

movex,n

next:

movax,num[si]

movbx,10

divbl

movbl,al

cbw

subbx,6

salbx,1

incs6[bx]

addsi,2

loopnext

popsi

popex

popbx

popax

ret

sub1endp

codeends

endstart

8、答:

datasegment

maxlendb40

ndb?

tabledb40dup(?)

chardb'a';查找字符'a'

even

addrdw3dup(?)

dataends

codesegment

assumecs:code,ds:data

mainprocfar

start:

pushds

movax,0

pushax

movax,data

movds,ax

leadx,maxlen

movah,Oah

int21h;從鍵盤接收字符串

movaddr,offsettable

movaddr+2,offsetn

movaddr+4,offsetchar

movbx,offsetaddr;通過地址表傳送變量地址

callcount;計算CHAR的出現(xiàn)次數(shù)

calldisplay;顯示

ret

mainendp

countprocnear;count子程序

pushsi

pushdi

pushax

pushex

movdi,[bx]

movsi,[bx+2]

movcl,byteptr[si]

movch,0

movsi,[bx+4]

moval,byteptr[si]

movbx,0

again:

empal,byteptr[di]

jne11

incbx

11:incdi

loopagain

popex

popax

popdi

popsi

ret

countendp

displayprocnear;display子程序

callcrlf;顯示回車和換行

movdl,char

movah,2

int21h

movdl,20h

movah,2

int21h

moval,bl

andal,Ofh

addal,30h

empal,3ah

jlprint

addal,7

print:

movdl,al

int21h

callcrlf

ret

displayendp

crlf

溫馨提示

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

最新文檔

評論

0/150

提交評論