汇编语言程序设计钱晓捷课后答案.docx

上传人:b****5 文档编号:7632325 上传时间:2023-01-25 格式:DOCX 页数:22 大小:35.38KB
下载 相关 举报
汇编语言程序设计钱晓捷课后答案.docx_第1页
第1页 / 共22页
汇编语言程序设计钱晓捷课后答案.docx_第2页
第2页 / 共22页
汇编语言程序设计钱晓捷课后答案.docx_第3页
第3页 / 共22页
汇编语言程序设计钱晓捷课后答案.docx_第4页
第4页 / 共22页
汇编语言程序设计钱晓捷课后答案.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计钱晓捷课后答案.docx

《汇编语言程序设计钱晓捷课后答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案.docx(22页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计钱晓捷课后答案.docx

汇编语言程序设计钱晓捷课后答案

汇编语言程序设计(第二版) 钱晓捷 习题答案

第二章(01)

(1)AX=1200h

(2)AX=0100h(3)AX=4C2Ah(4)AX=3412h(5)AX=4C2Ah(6)AX=7856h(7)AX=65B7h

(1)两操作数类型不匹配

(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[BP](7)源操作数应为[BX+DI]?

(8)立即数不能作目的操作数

leabx,table;获取table的首地址,BX=200Hmoval,8;传送欲转换的数字,AL=8xlat;转换为格雷码,AL=12H

堆栈是一种按“先进后出”原则存取数据的存储区域。

堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。

movax,8057hpushaxmovax,0f79hpushaxpopbx;bx=0f79hpop[bx];DS:

[0f79h]=8057h

AL=89hCFZFSFOFPFAL=12h10011AL=0afh00101AL=0afh10101AL=00h01001AL=0ffh00101AL=00h01001

W=X+Y+24-Z

(1)ADDDX,BX

(2)ADDAL,[BX+SI](3)ADD[BX+0B2H],CX(4)ADDWORDPTR[0520H],3412H(5)ADDAL,0A0H

;为了避免与操作数地址混淆,将题中X,Y,Z,V字操作数改为A,B,C,Dmovax,X;ax=A?

imulY;dx,ax=A*B(将操作数看作符号数,以下同)movcx,ax?

movbx,dx;bx,ax<--dx,ax=A*B?

movax,Z;ax=C?

cwd;dx,ax=C(扩展符号后为双字)addcx,ax?

adcbx,dx;bx,cx<--bx,cx+dx,ax=A*B+Csubcx,540?

sbbbx,0;bx,cx<--A*B+C-540?

movax,V;ax=D?

cwd;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

1470h

0

0

0

0

0

Orax,ax

1470h

0

0

0

0

0

Xorax,ax

0

0

0

0

1

1

Notax

0ffffh

-

-

-

-

-

Testax,0f0f0h

0ffffh

0

0

1

0

1

注意:

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];转移的有效地址EA=[ds:

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码移到高半字节oral,ah;组合成压缩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;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!

Overflow!

’,‘$’?

movdx,errmsg;错误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('$')array2db0dh,0ah,'$'dataendscodesegment'code'assumecs:

code,ds:

data,ss:

stackstart:

movax,datamovds,axmovah,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,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=100my7cequmydatasegends

;段地址:

表示标号所在代码段的段地址;偏移地址:

表示标号所在代码段的段内偏移地址;类型:

引用该标号时,表示它所在同一个段――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:

incsi;指向下一个数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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1