汇编语言程序设计钱晓捷课后答案.docx
《汇编语言程序设计钱晓捷课后答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案.docx(60页珍藏版)》请在冰豆网上搜索。
![汇编语言程序设计钱晓捷课后答案.docx](https://file1.bdocx.com/fileroot1/2022-11/25/ad49eb3f-deab-4fb1-abe0-110b89ca6eca/ad49eb3f-deab-4fb1-abe0-110b89ca6eca1.gif)
汇编语言程序设计钱晓捷课后答案
汇编语言程序设计(第二版) 钱晓捷 习题答案
第二章(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=200H
moval,8 ;传送欲转换的数字,AL=8
xlat ;转换为格雷码,AL=12H
堆栈是一种按“先进后出”原则存取数据的存储区域。
堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。
movax,8057h
pushax
movax,0f79h
pushax
popbx ;bx=0f79h
pop[bx] ;DS:
[0f79h]=8057h
AL=89h CF ZF SF OF PF
AL=12h 1 0 0 1 1
AL=0afh 0 0 1 0 1
AL=0afh 1 0 1 0 1
AL=00h 0 1 0 0 1
AL=0ffh 0 0 1 0 1AL=00h 0 1 0 0 1
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
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
Mov ax,1407h
1470h
-
-
-
-
-
And ax,ax
1470h
0
0
0
0
0
Or ax,ax
1470h
0
0
0
0
0
Xor ax,ax
0
0
0
0
1
1
Not ax
0ffffh
-
-
-
-
-
Test ax,0f0f0h
0ffffh
0
0
1
0
1
注意:
1.mov,not指令不影响标志位
2.其他逻辑指令使CF=OF=0,根据结果影响其他标志位。
第2章(03)
;
指令 注释 执行结果 CFOFSFZFPF
movsi,ax si=ax si=0008h - - - - -
shlsi,1 si=2*ax si=0010h 0 0 0 0 0
addsi,ax si=3*ax si=0018h 0 0 0 0 1
movdx,bx dx=bx dx=0010h - - - - -
movcl,03h cl=03h - - - - -
shldx,cl dx=8*bx dx=0080h 0 u 0 0 0
subdx,bx dx=7*bx dx=0070h 0 0 0 0 0
adddx,si dx=7*bx+3*ax dx=0088h 0 0 0 0 1
注意:
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
movcl,3
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] ;转移的有效地址EA=[ds:
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
cmpax,si
jleless_eq
jgeless_eq
(6)若DI≤DX,转到below_eq执行。
cmpdi,dx
cmpdx,di
jbebelow_eq
jaebelow_eq
;答:
将首地址为array得20个字的数组求和,并将结果存入total单元中。
;
(1)
movsi,0
movdl,string[si] ;第1个字符送dl寄存器
movsi,5
movdh,string[si] ;第6个字符送dh寄存器
(2)
xorsi,si ;si清零
moval,buffer[si] ;第一字节
incsi
movah,buffer[si] ;第二字节
movcl,4
shlah,cl ;BCD码移到高半字节
oral,ah ;组合成压缩BCD码
movdl,al ;存入dl寄..
incsi
moval,buffer[si] ;第三字节
incsi
movah,buffer[si] ;第四字节
movcl,4
shlah,cl ;BCD码移到高半字节
oral,ah ;组合成压缩BCD码
movdh,al ;存入dh寄..
(3)
testdx,0f000h
jzzero
movax,-1
jmpdone
zero:
movax,0
done:
ret
(4)
leabx,buffer1
leadx,buffer2
movcx,8 ;8个字节
xorsi,si ;si=0
clc ;CF=0
(5)
movax,0b800h
movds,ax ;段地址
xorsi,si ;地址偏移量si=0
xordx,dx ;和的高字dx=0
movcx,99 ;加的次数
movax,[si] ;第一个数
again:
incsi ;指向下一个字单元
incsi
addax,[si] ;加下一个数
jnc noc ;无进位转
incdx ;有进位dx=dx+1
noc:
deccx ;次数-1
jnzcx,again ;非0继续加
ret
(6)
movsi,offsetstring
movcx,8000h ;32k=2^15=8000h
again:
cmp[si],’$’
jnznext
mov[si],20h ;if[si]=’$’[si]<--’’
next:
incsi
loopagain
(7)
xorsi,si ;si<--0
movcx,100 ;循环次数
again:
decarray[si]
deccx
jnz again
(8)
xorsi,si ;si<--0
coun:
cmpstring[si],’$’
je done
incsi
jmpcoun
done:
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码和
;okmsg db‘OK’,‘$’errmsg db‘Error!
Overflow!
’,‘$’ …
movax,X
subax,Y
jooverflow
movdx,offsetokmsg
jmpnext
overflow:
movdx,errmsg
next:
movah,9
int21h
错误:
movax,X
subax,Y
jooverflow
movdx,offsetokmsg
okmsg db‘OK’,‘$’
movdx,errmsg ;错误1:
数据定义在代码中
movah,9
int21h
overflow:
errmsgdb‘Error!
Overflow!
’,‘$’
movdx,errmsg ;错误2:
缺少JMP指令
movah,9
int21h
;;
.modelsmall
.stack
.data
arraydb255
db0
array1db255dup('$')
array2db0dh,0ah,'$'
.code
.startup
movah,0ah ;键盘输入字符串
movdx,offsetarray
int21h
movdx,offsetarray2;回车换行
movah,09h
int21h
movbx,offsetarray1
again:
moval,[bx]
cmpal,'$'
jzdone
cmpal,'a' ;小于a和大于z的字符不是小写字母
jbnext
cmpal,'z'
janext
subal,20h ;在a和z之间的字符才是小写字母,转换为大写
mov[bx],al ;保存到原位置
next:
incbx
jmpagain
done:
movdx,offsetarray1
movah,09h
int21h
.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
int21h
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
int21h
.exit0 ;终止程序执行,返回DOS
error:
movah,09h ;出错,调用DOS功能显示str2字符串
movdx,offsetstr2
int21h
jmpgetkey ;等待按键
end ;汇编结束
;;
stack segment
dw512dup()
stack ends
data segment
arraydb255
db0
array1db255dup('$')
array2db0dh,0ah,'$'
dataends
codesegment'code'
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movah,0ah ;键盘输入字符串
movdx,offsetarray
int21h
movdx,offsetarray2;回车换行
movah,09h
int21h
movbx,offsetarray1
again:
moval,[bx]
cmpal,'$'
jzdone
cmpal,'a' ;小于a和大于z的字符不是小写字母
jbnext
cmpal,'z'
janext
subal,20h ;在a和z之间的字符才是小写字母,转换为大写
mov[bx],al ;保存到原位置
next:
incbx
jmpagain
done:
movdx,offsetarray1
movah,09h
int21h
movax,4c00h
int21h
codeends
endstart
;
(1)movbyteptr[bx],1000 ;1000超出了一个字节范围
(2)movbx,offsetmyword[si];寄存器的值只有程序执行时才能确定,
;而offset是汇编过程计算偏移地址,故无法确定
;可以改为leabx,myword[si]
(3)