IBM-PC汇编语言程序设计(第二版)课后习题答案_第1页
IBM-PC汇编语言程序设计(第二版)课后习题答案_第2页
IBM-PC汇编语言程序设计(第二版)课后习题答案_第3页
IBM-PC汇编语言程序设计(第二版)课后习题答案_第4页
IBM-PC汇编语言程序设计(第二版)课后习题答案_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出

版社)(沈美明,温冬蝉著)答案

第三章答案1-22

1.

(1)立即寻址没有

(2)直接寻址7237H

(3)使用BX的寄存器寻址没有

(4)使用BX的间接寻址637DH

(5)使用BX的寄存器相对寻址0D5F0H

(6)基址变址寻址8E18H

(7)相对基址变址004FH

2.根据下列要求,写出相应的汇编指令。

(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.现有(DS)=2000H,(BX)-OIOOH,(SD=0002H,(20100)=12H,(20101)=34H,(20102)=56H,

(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完

后,AX寄存器的内容。

(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.转向地址OBJ的值分别为:(1)064DH(2)0691H(3)05E0H

注意有符号数的符号位

8.(1)MOVAX,OABH立即数寻址无物理地址

(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里的内容送到AX里,指令执行完后,(AX)=123411

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

指令执行完后,(AX)=0032H

11.执行完指令后,(AX)=1EOOII

12.LEAAX,CSTRING

MOVDL,AX

MOVDH,[AX+6]

13.这参考课本P51—P53

14.LESBX,[2000]

MOVAX,ES:[BX]

15.运算结果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;结果保存在z中

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

ADDAX,9;R+9

MOVBX,X;X送到BX中

ADDBX,6;X+6

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

MOVBX,W;W送到BX中

SUBBX,AX;W-(R+9)-(X+6),连续减去两个数,相当于减去这两个数的和

MOVZ,BX;最终结果送到Z中

(3)

MOVAX,W;把W送到AX

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

MOVBX,Y把Y送到BX里

ADDBX,6Y+6

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

MOVZ,AX»把商送到Z中,

MOVR,DX把余数送到R中

(4)

MOVAX,W;把W送至IJAX中

SUBAX,X;W-X

CWD;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位

保;在DX中

MOVBX,5;把5送到BX中

IDIVBX;(W-X)/5被除数为32位,除数为16位商为16位

IMULY:上一步结果再乖以Y,积为32位

MOVBX,2:把2送到BX中

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

MOVZ,EAX;把结果中低32位放入Z双字单元中

MOV[Z+4],EDX;把结果中高32位放入Z+4双字单元中

18.

指令本条指令执行完后AX的内容执行完后CF,SF,ZF的值

MOVAX,1234H1234H000

MOVCL,41234H000

ROLAX,CL2341H100

DECAX2340H100

MOVCX,42340H100

MULCX8918H000

INT20H

程序结束后,(AX)=891811(DX)=000011

19.

指令执行完后AX的内容执行完后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;结果商保存在AL中,余数在AH中

(7)MOVAX,DATAX

CDW

DIVDATAY

21.NEGDX

NEGAX

SBBDX,0

22.

MOVAX,A;把曼字数的低字放到AX中

MOVDX,[A+2];把曼字房数的高字放到DX中

TESTDX,800011;字房数的符虢

JZRIGHT;如果是非负数,即直接保存

NEGDX;如果是负数,即求衲

NEGAX

SBBDX,0

RIGHT:MOVB,AX

MOV[B+2],DX

23.每僚指令单褐轨行完彳笈的结果依次卷:

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

24.轨行指令序列彳笈,BX的内容卷:ODAH

25.

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

MOVAX,35H;53D=35H

SHLAX,1

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

MOVAX,35H

SHRAX,1

其他的同理~~

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

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

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

ODCH

28.^程序段轨行完彳爰,BX寄存器的内容是:C02DH

29.(1)从左到右把CONMAE中的字符串伟送到PRUNE的程序实现:

LEASI,CONAME;把CONAME中第一个字节的偏移地址送到SI中

LEADI,PRUNE;把PRLINE中第一个字节的偏移地址送到DI中

MOVCX,20;把重复次数放到CX里

CLD;让SIDI从低地址指向高地址(即从左到右传送)

REPMOVSB;传送

(2)从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:

LEASI,CONAME

LEADI,PRLINE

MOVCX,20

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

REPMOVSB

(3)把CONAME中的第三和第四f0字^装入AX的程序^现:

LEASI,[CONAME+3]

LODSW

(4)把AX寄存器的内容存入优PRLINE+5日目始的字套。中的程序

LEADI,[PRLINE+5]

STOSW

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

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

MOVCX,20;把重^次数放到CX中

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

CLD;从低到高

REPNESCASB;比敕

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

30.

MOVCX,12H;把重^次数放到CX中。道凄用十六暹制表示

MOVSI,0;初始化SI

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

CHECK:CMPAX,STRINGtSl];依次查找

INCSI

LOOPNECHECK:找到了就退出

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

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

31。(1)用空格符清除PRINTLINE域的程序实现:

MOVAL,20H

LEADI,PRINTLINE

MOVCX,132

CLD

REPSTOSB

(2)在STUDENT_ADDR中查找第一个'_'的程序实现:

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

MOVSI,0;初始化SI

MOVCX,9;把重禊次数放入CX中

;依次检查STUDENT-ADDR中的字符是否卷"_",找到第一个停下来

CHECK:CMPAX,STUDENT_ADDR[SI];

INCSI;

LOOPNZCHECK;

(3)在STUDENT.ADDR中查找最后一个”「的程序实现:

;和第二题不同的就是道次是优右到左查前,所以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;把重复次数放到CX中

CLD;让DI从低位移到高位

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

JZSTORE;如果全是空格符,就转到STORE中

;用*代替空格

STORE:MOVAL2AH

MOVCX,30

STD;注意,这里是把前面从低到高移动的DI再从高到低移上去”

REPSTOSB

(5)程序实现:

;把STUDENT_NAME移到PRINTLINE的前30个字节中

LEASI,STUDENT_NAME

LEADI,PRINT_LINE

MOVCX,30

CLD

REPMOVSB;把STUDENT_ADDR移至ijPRINT_LINE的后9个字节中

LEASI,[STUDENT_ADDR+9]

LEADI,[PRINT_LINE+132]

MOVCX,9

STD

REPMOVSB

32.程序实现:

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)跳转到:LI

(2)跳转到LI

(3)跳转到L2

(4)跳转到L5

(5)跳转到L5

35.

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

(2)可以引起转移到L1的指令有:同上

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

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

(5)可以引起转移到L1的指令有:同上

(6)可以引起转移到L1的指令有:同(3)

(7)可以引起转移到L1的指令有:同上

36o

37.程序流程图就不画了,程序如下~~

MOVAL,STAUSESI];把要测试的字节放到AL中

ANDAL,2AH;把第一,三,五位为一其他位为。的数一2AH,与这个字节比较,结果放到AL

JZR0UTINE_4;如果结果为0,则三位都为0

XORAL,2AH;前面相与的结果再与2AH异或

JZROUTINE_1;如果结果为0,则三位都为1

BSFBL,AL;

BSRBL,AL

CMPBL,CL

;如果向前和向后测试后,第一个1的位置相同,说明只有一个1,则异或运算前有AL中有两个1

JER0UTINE_2

ROUTINE_1

注:本题还有其他解法,请大家自己试试s

38.(1)当括号内是:LOOP时,循环四次,程序结束后

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

(2)当括号内是:LOOPE时,不循环,程序结束后

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

(3)当括号内是:LOOPNE时:循环三次,程序结束后

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

第四章答案

1。下列指令的错误

(1)MOVAH,BX源操作数与目的操作数长度不相同~

(2)MOV[BX],[SI]这是两个内存单元在传递数据,而这在汇编语言中是不允许的~~~

(3)MOVAX,[SI][DI]不能用两个变址连用,其中一个应为基址~

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

(5)MOVBYTEPTR[BX],1000必须有一个为寄存器

(6)MOVBX,OFFSETMYDAT[SI]OFFSET不能与复杂操作数相连~

(7)MOVCS,AX不能对CS赋值~

(8)MOVECX,AX操作数类型不同~

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

3。(1)非法,操作数类型不同

(2)合法

(3)非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?~~~呵~

(4)合法~

(5)合法~

(6)合法

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

(8)非法,两个内存单元地址相加没有意义~

(9)合法

(10)非法,同(3)

4。(1)两内存单元传递数据

(2)操作数类型不同

(3)跳转指令只能跳转到符号地址

(4)转移指令后不能为变量,只能为标号

(5)格式不对,应为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表示该数据段的长度〜

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)引用应该从;开始把那个“/”改成“;”

(4)结构混乱改为:

MAIN_PROCPROCFAR

MAIN_PROCENDP

END

16。程序框架如下:

DATA_SEGSEGMENT;定羲数撼段

ORGOEOOOH;^下一字第地址卷OEOOOH

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

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

DATA_SEGENDS:数摞段结束

STACK_SEGSEGMENT;定羲堆梭段

ALIGN16;18下一字第优小段首地址^始

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;数据段定义

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编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示

这三个字符.

.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位数分成4组,每组4位,然后把这四组数分别放在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编写一个程序,要求能从键盘接收一个个位数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个数据的数组M分成两个数组:正数数组和负数数组N,并分别把

这两个数组中的数据个数显示出来。

.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字数组中的最小偶数,并把它放在AX"」。

此题根据题意要求应该使用完整汇编格式,因为精简格式也使用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;偶数数量计数

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编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等

值的二进制数。

.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设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中

的出现次数,并以格式〃SUNXXXX〃显示出次数。

.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从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。

.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字数组,试编制程序删除数组中所有为零的项,并将后续项向前

压缩,最后将数组的剩余部分补上零。

.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:结束

18o

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

第六章答案

2、答:(1)NAME1NAMELIST<>

(2)MOVAX,DATA;假设结构变量NAME1定义在数据段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的出现次数

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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论