汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx
《汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx(60页珍藏版)》请在冰豆网上搜索。
1
0
1
AL=0afh
AL=00h
AL=0ffh
1AL=00h
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,D
movax,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+C
subcx,540
sbbbx,0
bx,cx<
--A*B+C-540
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
Mov
ax,1407h
1470h
-
And
ax,ax
Or
Xor
1
Not
ax
0ffffh
Test
ax,0f0f0h
注意:
1.mov,not指令不影响标志位
2.其他逻辑指令使CF=OF=0,根据结果影响其他标志位。
第2章(03)
指令
注释
执行结果
CFOFSFZFPF
movsi,ax
si=ax
si=0008h
-
-
shlsi,1
si=2*ax
si=0010h
0
addsi,ax
si=3*ax
si=0018h
movdx,bx
dx=bx
dx=0010h
movcl,03h
cl=03h
shldx,cl
dx=8*bx
dx=0080h
u
subdx,bx
dx=7*bx
dx=0070h
adddx,si
dx=7*bx+3*ax
dx=0088h
注意:
1.左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。
2.移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。
根据最高符号位是否改变设置OF,如改变OF=1.
3.‘u’表示无定义,‘-’表示无影响。
(1)
不考虑进位movbl,al
movcl,3
shlal,cl
addal,bl
shlbl,1
addal,bl
考虑进位xorah,ah
movbx,ax
shlax,cl
addax,bx
shlbx,1
addax,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,则变为3
movcl,4
again:
shrdx,1
实现逻辑右移
采用“sardx,1”,则实现算术右移
rcrax,1
deccl
jnzagain
(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,1e1eh
jeequal
AX=1e1eh(异或后为0)
(2)testal,b
jnzthere
AL的D0或D7至少有一位为1
(3)cmpcx,64h
jbthere
CX(无符号数)<64h
movcx,0
不循环,因为一进入循环就判cx=0如cx=0就退出循环
delay:
loopdelay
(1)若DX>
DI,转到above执行
cmpdx,di
jaabove
=jnbeabove
(2)若AX>
SI,转到greater执行
cmpax,si
jggreater
=jnlegreater
(3)若CX=0,转到zero执行
cmpcx,0
jcxzzero
jzzero
(4)若AX-SI产生溢出,转到overflow执行;
cmpax,di
jooverflow
(5)若SI≤AX,转到less_eq执行;
cmpsi,ax
jleless_eq
jgeless_eq
(6)若DI≤DX,转到below_eq执行。
cmpdi,dx
jbebelow_eq
jaebelow_eq
答:
将首地址为array得20个字的数组求和,并将结果存入total单元中。
movsi,0
movdl,string[si]
第1个字符送dl寄存器
movsi,5
movdh,string[si]
第6个字符送dh寄存器
xorsi,si
si清零
moval,buffer[si]
第一字节
incsi
movah,buffer[si]
第二字节
movcl,4
shlah,cl
BCD码移到高半字节
oral,ah
组合成压缩BCD码
movdl,al
存入dl寄..
第三字节
第四字节
movdh,al
存入dh寄..
(3)
testdx,0f000h
jzzero
movax,-1
jmpdone
zero:
movax,0
done:
ret
(4)
leabx,buffer1
leadx,buffer2
movcx,8
8个字节
si=0
clc
CF=0
(5)
movax,0b800h
movds,ax
段地址
地址偏移量si=0
xordx,dx
和的高字dx=0
movcx,99
加的次数
movax,[si]
第一个数
incsi
指向下一个字单元
addax,[si]
加下一个数
jnc
noc
无进位转
incdx
有进位dx=dx+1
noc:
deccx
次数-1
jnzcx,again
非0继续加
(6)
movsi,offsetstring
movcx,8000h
32k=2^15=8000h
cmp[si],’$’
jnznext
mov[si],20h
if[si]=’$’[si]<
--’’
next:
loopagain
(7)
si<
--0
movcx,100
循环次数
decarray[si]
deccx
jnz
again
(8)
coun:
cmpstring[si],’$’
je
done
jmpcoun
ret
2..27;
(1)使CF=0:
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码和
okmsg
db‘OK’,‘$’errmsg
db‘Error!
Overflow!
’,‘$’
…
movax,X
subax,Y
movdx,offsetokmsg
jmpnext
overflow:
movdx,errmsg
movah,9
int21h
错误:
movdx,offsetokmsg
db‘OK’,‘$’
movdx,errmsg
错误1:
数据定义在代码中
errmsgdb‘Error!
错误2:
缺少JMP指令
.modelsmall
.stack
.data
arraydb255
db0
array1db255dup('
$'
)
array2db0dh,0ah,'
.code
.startup
movah,0ah
键盘输入字符串
movdx,offsetarray
int21h
movdx,offsetarray2;
回车换行
movah,09h
movbx,offsetarray1
moval,[bx]
cmpal,'
jzdone
a'
小于a和大于z的字符不是小写字母
jbnext
z'
janext
subal,20h
在a和z之间的字符才是小写字母,转换为大写
mov[bx],al
保存到原位置
incbx
jmpagain
done:
movdx,offsetarray1
.exit0
end
第三章(01)
硬指令:
每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;
伪指令:
伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。
⒈
编辑
文本编辑程序
汇编语言源程序.asm
⒉
汇编
汇编程序
目标模块文件.obj
⒊
连接
连接程序
可执行文件.exe或
⒋
调试
调试程序
应用程序
;
简化段定义格式
.modelsmall;
定义程序的存储模式(小模式)
.stack
定义堆栈段(默认1024个字节)
.data
定义数据段
str1
ab’InputNumber:
0~9:
’,0dh,0ah,’$’
str2
ab’Error!
’,0dh,0ah,’$’
.cade
定义代码段
.startup
说明程序的起始点,建立ds,ss的内容。
movah,09h
显示str1字符串
movdx,offsetstr1
gtekey:
movah,1
调用BIOS判断按键功能
int16h
jz
getkey
如zf=0,无键按下,等待
cmp
al,‘0’
有键按下,键值与‘0’比较
jberror
如<
‘0’,出错处理
cmpal,‘9’
有键按下,键值与‘9’比较
jaerror
如〉‘9’,出错处理
movah,02h
调用DOS显示字符功能,显示该数字
movdl,al
.exit0
终止程序执行,返回DOS
error:
出错,调用DOS功能显示str2字符串
movdx,offsetstr2
jmpgetkey
等待按键
end
汇编结束
stack
segment
dw512dup()
ends
data
segment
dataends
codesegment'
code'
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movax,4c00h
codeends
endstart
(1)movbyteptr[bx],1000
1000超出了一个字节范围
(2)movbx,offsetmyword[si];
寄存器的值只有程序执行时才能确定,
而offset是汇编过程计算偏移地址,故无法确定
可以改为leabx,myword[si]
(3)