汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx
- 文档编号:20753023
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:22
- 大小:35.38KB
汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx
《汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
movax,V;
ax=D?
dx,ax=D(扩展符号后为双字)?
subax,cx?
sbbdx,bx;
dx,ax=dx,ax-bx,cx=D-(A*B+C-540)idivX;
运算结果:
[D-(A*B+C-540h)]/A;
ax存商,dx存余数
;
(1)xchg的操作数不能是立即数(2不能对CS直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5)adc的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in不支持超过FFH的直接寻址(8)out只能以AL/AX为源操作数
第二章(02)
指令
AX的值
CF
OF
SF
ZF
PF
Movax,1407h
1470h
-
Andax,ax
Orax,ax
Xorax,ax
1
Notax
0ffffh
Testax,0f0f0h
注意:
1.mov,not指令不影响标志位2.其他逻辑指令使CF=OF=0,根据结果影响其他标志位。
第2章(03)
指令注释执行结果CFOFSFZFPF
movsi,axsi=axsi=0008h-----
shlsi,1si=2*axsi=0010h00000
addsi,axsi=3*axsi=0018h00001
movdx,bxdx=bxdx=0010h-----
movcl,03hcl=03h-----
shldx,cldx=8*bxdx=0080h0u000
subdx,bxdx=7*bxdx=0070h00000
adddx,sidx=7*bx+3*axdx=0088h00001
注意:
1.左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。
2.移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。
根据最高符号位是否改变设置OF,如改变OF=1.3.‘u’表示无定义,‘-’表示无影响。
(1);
不考虑进位movbl,almovcl,3shlal,claddal,bl;
shlbl,1addal,bl;
考虑进位xorah,ahmovbx,axmovcl,3shlax,claddax,bx;
shlbx,1addax,bx
(2)数字0~9的ASCII码是:
30h~39h非压缩BCD码的0~9是:
00h~09h方法一:
andal,0fh;
实现ASCII到非压缩BCD码的转换oral,30h;
实现非压缩BCD码到ASCII的转换方法二:
xoral,30h;
求反D5D4位,其他不变;
即高4位为3,则变为0;
高4位为0,则变为3movcl,4again:
shrdx,1;
实现逻辑右移;
采用“sardx,1”,则实现算术右移rcrax,1deccljnzagain
(1)用sar编写
8086的条件转移的转移范围:
在当前指令地址的+127-----128之内。
如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。
(1)JMPBx;
转移的有效地址EA=BX=1256h
(2)JMPtABLE[Bx];
转移的有效地址EA=[ds:
20a1h+1256h]=[232f7]=3280h(3)JMP[Bx][si];
1256h+528fh]=264e5h=2450h
(1)xorax,1e1ehjeequal;
AX=1e1eh(异或后为0)
(2)testal,bjnzthere;
AL的D0或D7至少有一位为1(3)cmpcx,64hjbthere;
CX(无符号数)<64h
movcx,0不循环,因为一进入循环就判cx=0如cx=0就退出循环delay:
loopdelay
(1)若DX>
DI,转到above执行cmpdx,dijaabove;
=jnbeabove
(2)若AX>
SI,转到greater执行cmpax,sijggreater;
=jnlegreater(3)若CX=0,转到zero执行cmpcx,0jcxzzerojzzero?
(4)若AX-SI产生溢出,转到overflow执行;
cmpax,dijooverflow(5)若SI≤AX,转到less_eq执行;
cmpsi,ax?
cmpax,sijleless_eq?
jgeless_eq(6)若DI≤DX,转到below_eq执行。
cmpdi,dx?
cmpdx,dijbebelow_eqjaebelow_eq
答:
将首地址为array得20个字的数组求和,并将结果存入total单元中。
(1)movsi,0movdl,string[si];
第1个字符送dl寄存器movsi,5movdh,string[si];
第6个字符送dh寄存器
(2)?
xorsi,si;
si清零moval,buffer[si];
第一字节incsimovah,buffer[si];
第二字节movcl,4shlah,cl;
BCD码移到高半字节oral,ah;
组合成压缩BCD码movdl,al;
存入dl寄..incsimoval,buffer[si];
第三字节incsimovah,buffer[si];
第四字节movcl,4shlah,cl;
组合成压缩BCD码movdh,al;
存入dh寄..(3)testdx,0f000hjzzeromovax,-1jmpdonezero:
movax,0done:
ret(4)leabx,buffer1?
leadx,buffer2movcx,8;
8个字节xorsi,si;
si=0?
clc;
CF=0(5)movax,0b800hmovds,ax;
段地址xorsi,si;
地址偏移量si=0xordx,dx;
和的高字dx=0movcx,99;
加的次数movax,[si];
第一个数again:
incsi;
指向下一个字单元incsiaddax,[si];
加下一个数jncnoc;
无进位转incdx;
有进位dx=dx+1noc:
deccx;
次数-1jnzcx,again;
非0继续加?
ret(6)movsi,offsetstringmovcx,8000h;
32k=2^15=8000hagain:
cmp[si],’$’jnznextmov[si],20h;
if[si]=’$’[si]<
--’’?
next:
incsiloopagain(7)xorsi,si;
si<
--0movcx,100;
循环次数again:
decarray[si]deccxjnzagain(8)xorsi,si;
--0coun:
cmpstring[si],’$’jedoneincsijmpcoundone:
ret?
2..27;
(1)使CF=0:
clc;
andax,ax;
orax,ax
(2)使AX=0:
xorax,ax;
andax,0;
movax,0(3)同时使AX=0和CF=0:
andax,0;
xorax,ax;
subax,ax
压缩BCD码加法:
AX←AX+BX出口参数:
AX=BCD码和
okmsgdb‘OK’,‘$’errmsgdb‘Error!
Overflow!
’,‘$’…?
movax,Xsubax,Yjooverflowmovdx,offsetokmsgjmpnextoverflow:
movdx,errmsgnext:
movah,9int21h错误:
movax,Xsubax,Yjooverflowmovdx,offsetokmsg?
okmsgdb‘OK’,‘$’?
movdx,errmsg;
错误1:
数据定义在代码中movah,9int21hoverflow:
errmsgdb‘Error!
’,‘$’?
错误2:
缺少JMP指令movah,9int21h
;
.modelsmall.stack.dataarraydb255db0array1db255dup('
$'
)array2db0dh,0ah,'
.code.startupmovah,0ah;
键盘输入字符串movdx,offsetarrayint21hmovdx,offsetarray2;
回车换行movah,09hint21hmovbx,offsetarray1again:
moval,[bx]cmpal,'
jzdonecmpal,'
a'
小于a和大于z的字符不是小写字母jbnextcmpal,'
z'
janextsubal,20h;
在a和z之间的字符才是小写字母,转换为大写mov[bx],al;
保存到原位置next:
incbxjmpagaindone:
movdx,offsetarray1movah,09hint21h.exit0end
第三章(01)
硬指令:
每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;
伪指令:
伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。
⒈编辑文本编辑程序汇编语言源程序.asm⒉汇编汇编程序目标模块文件.obj⒊连接连接程序可执行文件.exe或⒋调试调试程序应用程序
;
简化段定义格式.modelsmall;
定义程序的存储模式(小模式).stack;
定义堆栈段(默认1024个字节).data;
定义数据段str1ab’InputNumber:
0~9:
’,0dh,0ah,’$’?
str2ab’Error!
’,0dh,0ah,’$’?
.cade;
定义代码段?
.startup;
说明程序的起始点,建立ds,ss的内容。
?
movah,09h;
显示str1字符串movdx,offsetstr1int21hgtekey:
movah,1;
调用BIOS判断按键功能int16hjzgetkey;
如zf=0,无键按下,等待cmpal,‘0’;
有键按下,键值与‘0’比较jberror;
如<
‘0’,出错处理cmpal,‘9’;
有键按下,键值与‘9’比较jaerror;
如〉‘9’,出错处理movah,02h;
调用DOS显示字符功能,显示该数字movdl,alint21h.exit0;
终止程序执行,返回DOSerror:
movah,09h;
出错,调用DOS功能显示str2字符串movdx,offsetstr2int21hjmpgetkey;
等待按键end;
汇编结束
stacksegmentdw512dup()stackendsdatasegmentarraydb255db0array1db255dup('
dataendscodesegment'
code'
assumecs:
code,ds:
data,ss:
stackstart:
movax,datamovds,axmovah,0ah;
movdx,offsetarray1movah,09hint21hmovax,4c00hint21hcodeendsendstart
(1)movbyteptr[bx],1000;
1000超出了一个字节范围
(2)movbx,offsetmyword[si];
寄存器的值只有程序执行时才能确定,;
而offset是汇编过程计算偏移地址,故无法确定;
可以改为leabx,myword[si](3)cmpmybyte1,mybyte2;
两个都是存储单元,指令不允许(4)moval,mybyte1+mybyte2;
变量值只有执行时才确定,汇编过程不能计算(5)subal,myword;
字节量AL与字量myword,类型不匹配(6)jnzmyword;
Jcc指令只有相对寻址方式,不支持间接寻址方式
前者为“与”操作硬指令助记符,可汇编成机器代码。
后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。
注:
对于逻辑运算,有关操作数可化为二进制数。
(1)moval,23hAND45hOR67h;
67h
(2)movax,1234h/16+1Oh;
133h(3)movax,NOT(65535XOR1234h);
1234h(4)moval,LOW1234hORHIGH5678h;
76h(5)movax,23hSHL4;
0234h(6)movax,1234hSHR6;
0048h(7)moval,’a’AND(NOT(’a’-’A’));
41h(8)moval,’H’OR00100000b;
68h(9)movax,(76543LT32768)XOR7654h;
7654h
假设block开始的数据块有32个字节数据:
16个正数+100(64h),16个负数-48(0doh)分别连续分布:
blockdb16dup(100),16dup(-48);
也可以是任意字节数据,随意分布。
dplusdb32dup();
为正数预留存储空间dminusdb32dup();
为负数预留存储空间countequ32;
字节数
mydatasegsegmentmy1bdb‘PersonalComputer’my2bdb20my3bdb14h;
20hmy4bdb00010100bmy5wdw20dup()my6cequ100;
my6c=100my7cequ<
PersonalComputer>
mydatasegends
段地址:
表示标号所在代码段的段地址;
偏移地址:
表示标号所在代码段的段内偏移地址;
类型:
引用该标号时,表示它所在同一个段――near类型,还是另外一个段――far类型。
mydatasegmentORGlO0hVARWDWl234H,5678HVARBDB3,4AGLIN4VARDDDH?
EVENBUFFDB10DUP()MESSDB’HELLO’MOVAX,OFFSETVARB+OFFSETMESS;
AX=4+16H=1AHMOVAX,TYFETYPEBUFF+TYPEMESS+TYPEVARD;
AX=1+1+4=06HMOVAX,SIZEVARW+SIZEBUFF+SIZEMESS;
AX=4+10+5=19=13HMOVAX,LENGTHVARW+LENGTHVARD;
AX=2+1=03HMOVAX,LENGTHBUFF+SIZEVARW;
AX=10+4=14=0EHMOVAX,TYPEBIGIN;
AX=FF02H(近)MOVAX,OFFSETBEGIN;
AX=1BH
段定义伪指令段名定位组合类别组名.CODE_TEXTWORDPUBLIC’CODE’?
.DATA_DATAWORDPUBLIC’DATA’DGROUP.STACKSTACKPARASTACK’STACK’DGROUP
.modelsmall.stack.datanumequ5datalistdw-1,0,2,5,4,.code.startupmovbx,offsetdatalistmovcx,numxorax,axagain:
addax,[bx]incbxincbxloopagainmov[bx],ax.exit0end
stacksegmentpara‘stack’?
dw512dup()stackendsdatasegmentdwordarraydb100dup()dataendscodesegment‘code’assumecs:
code,ds:
data,es:
data,ss:
stackorg100hstart:
movax,datamovds,axmoves,ax?
movdi,offsetarraymoval,64hmovcx,100cldrepstosbmovax,4c00hint21hcodeendsendstart
解答
.modelsmall.stack256;
定义堆栈段大小为256个字节.dataanumddh;
定义两个双字的数(随意)bnumddhsumdd;
定义结果,执行后为:
h.code.startupxorsi,si;
相对于变量的位移量清零movcx,2;
分高低字分别相加,共两次clc;
清零cfagain:
movax,anum[si];
取第一个数的一个字(先低字后高字)adcax,bnum[si];
取第二个数的一个字(先低字后高字)movsum[si],ax;
存和的一个字(先低字后高字)incsi;
修改位移量指向下一个字(加2)incsiloopagain;
cx=cx-1,ifcx<
>
0,jumpagain.exit0end
.startupxorsi,si;
位移量清零moval,bdata[si];
取第一个数movcx,num-1;
累加次数again:
指向下一个数adcal,bdata[si];
累加loopagain;
如未完,继续累加movsum,al;
完了,存结果.exit0end
思路:
设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。
这里仅列出代码段:
movbl,al;
将al中的两组分开andal,0fh;
屏蔽高四位后送almovcl,4;
原al中的数据逻辑右移4次送blshrbl,clmovdl,ah;
将ah中的两组分开anddl,0f0h;
屏蔽低高四位后送dlmovcl,4;
原ah中的数据逻辑右移4次送dlshrdl,clmovcl,ah;
屏蔽高四位后送clandcl,0fh
getkey:
movah,1;
从键盘输入,出口:
al存键值int21hcmpal,’a’;
判键值是小写字母jbgetkaycmpal,’z’jagetkaysubal,20h;
是小写字母转换为大写字母movah,09h;
显示int21h
(1)将jm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 钱晓捷 课后 答案