汇编语言程序设计钱晓捷课后答案Word文档下载推荐.docx
《汇编语言程序设计钱晓捷课后答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案Word文档下载推荐.docx(47页珍藏版)》请在冰豆网上搜索。
AL=12h
1
0
1
AL=0afh
AL=00h
AL=0ffh
1AL=00h
7W=X+Y+24-Z
8
(1)ADDDX,BX
(2)ADDAL,[BX+SI]
(3)ADD[BX+0B2H],CX
(4)ADDWORDPTR[0520H],3412H
(5)ADDAL,0A0H
2.9;
为了避免与操作数地址混淆,将题中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存余数
10;
(1)xchg的操作数不能是立即数
(2不能对CS直接赋值
(3)两个操作数不能都是存储单元
(4)堆栈的操作数不能是字节量
(5)adc的操作数不能是段寄存器
(6)没有确定是字节还是字操作
(7)in不支持超过FFH的直接寻址
(8)out只能以AL/AX为源操作数
第二章(02)
11;
指令
AX的值
CF
OF
SF
ZF
PF
Mov
ax,1407h
1470h
—
-
And
ax,ax
Or
Xor
Not
ax
0ffffh
Test
ax,0f0f0h
注意:
1.mov,not指令不影响标志位
2。
其他逻辑指令使CF=OF=0,根据结果影响其他标志位。
第2章(03)
2.12;
指令
注释
执行结果
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'
表示无定义,‘—’表示无影响。
2.13;
(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
14;
(1)用sar编写
2.20;
8086的条件转移的转移范围:
在当前指令地址的+127——-—-128之内。
如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址.
21;
(1)JMPBx
转移的有效地址EA=BX=1256h
(2)JMPtABLE[Bx];
转移的有效地址EA=[ds:
20a1h+1256h]=[232f7]=3280h
(3)JMP[Bx][si]
转移的有效地址EA=[ds:
1256h+528fh]=264e5h=2450h
2.22;
(1)xorax,1e1eh
jeequal
AX=1e1eh(异或后为0)
(2)testal,10000001b
jnzthere
AL的D0或D7至少有一位为1
(3)cmpcx,64h
jbthere
CX(无符号数)<64h
2.23;
movcx,0
不循环,因为一进入循环就判cx=0?
如cx=0就退出循环
delay:
loopdelay
2.24;
(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
cmpax,si
jleless_eq
jgeless_eq
(6)若DI≤DX,转到below_eq执行。
cmpdi,dx
cmpdx,di
jbebelow_eq
jaebelow_eq
25;
答:
将首地址为array得20个字的数组求和,并将结果存入total单元中。
26;
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寄..
moval,buffer[si]
第三字节
movah,buffer[si]
第四字节
shlah,cl
oral,ah
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]
第一个数
again:
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)
xorsi,si
si<
--0
coun:
cmpstring[si],’$’
je
done
jmpcoun
ret
。
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
29;
压缩BCD码加法:
AX←AX+BX
出口参数:
AX=BCD码和
2.34;
okmsg
db‘OK’,‘$’errmsg
db‘Error!
Overflow!
'
‘$’
…
movax,X
subax,Y
movdx,offsetokmsg
jmpnext
overflow:
movdx,errmsg
next:
movah,9
int21h
错误:
movax,X
movdx,offsetokmsg
db‘OK’,‘$’
movdx,errmsg
错误1:
数据定义在代码中
movah,9
errmsgdb‘Error!
,‘$'
movdx,errmsg
错误2:
缺少JMP指令
2.37;
xt237.asm
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
cmpal,’a’
小于a和大于z的字符不是小写字母
jbnext
cmpal,’z'
janext
subal,20h
在a和z之间的字符才是小写字母,转换为大写
mov[bx],al
保存到原位置
incbx
jmpagain
done:
movdx,offsetarray1
movah,09h
exit0
end
第三章(01)
3.1;
硬指令:
每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;
伪指令:
伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。
3.2;
3.5;
⒈
编辑
文本编辑程序
汇编语言源程序.asm
⒉
汇编
汇编程序
目标模块文件.obj
⒊
连接
连接程序
可执行文件.exe或。
com
⒋
调试
调试程序
应用程序
6;
xt236。
asm
简化段定义格式
.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
汇编结束
7;
xt307。
asm
segment
dw512dup(?
)
ends
data
segment
array1db255dup('
$’)
array2db0dh,0ah,’$’
dataends
codesegment’code’
assumecs:
code,ds:
data,ss:
start:
movax,data
movds,ax
movah,0ah
movdx,offsetarray2;
movbx,offsetarray1
moval,[bx]
cmpal,’$'
cmpal,’z’
subal,20h
mov[bx],al
done:
movdx,offsetarray1
movax,4c00h
codeends
endstart
9;
(1)