版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四年级劳动与技术上册教案 温馨可爱的纺织品(苏教版)-劳动
- 冀教版小学信息技术五年级上册《第5课 转动的风车》教学设计
- 《平移》(教学设计)-2023-2024学年人教版四年级数学下册
- 2024-2025学年特殊情境下的心理教育教学设计
- 北师大版数学五年级下册 分数加减法练习一-教学设计
- 《两小儿辩日》教学设计-2023-2024学年统编版六年级语文下册
- 川教版(2019)七年级上册 信息技术 3.2 在Python中用turtle模块画图 教案(3课时)
- 在水月中感悟生命况味赤壁赋第二课时教案
- 小学生校园欺凌心理咨询
- 七年级语文上册 第五单元 动物世界 17 动物笑谈教案 新人教版
- 湘科版科学六年级上册全册教案(含反思)
- LED显示屏大华系列解决方案
- 微生物检验实验室不染色标本检查法标准操作规程
- 动物防疫与检疫技术课件
- 腹腔镜下宫颈癌根治术
- 南通市图书馆招聘考试真题2022
- 小学生心理健康教育PPT完整全套教学课件
- 老后破产:名为“长寿”的噩梦(译文纪实)
- 精神分裂症诊疗
- 矿山(非煤矿山)安全生产综合整治检查表
- 术前禁食禁饮指南专家讲座
评论
0/150
提交评论