汇编语言程序设计钱晓捷课后答案docx.docx
- 文档编号:10506075
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:67
- 大小:242.63KB
汇编语言程序设计钱晓捷课后答案docx.docx
《汇编语言程序设计钱晓捷课后答案docx.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案docx.docx(67页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计钱晓捷课后答案docx
汇编语言程序设计(第二版)钱晓捷习题答案
第二章(Ol)
2.1
(1)AX=120Oh
(2)AX=0100h
(3)AX=4C2Ah
(4)AX=3412h
(5)AX=4C2Ah
(6)AX=7856h
(7)AX=65B7h
2.2
(1)两操作数类型不匹配
(2)IP指令指针禁止用户访问
(3)立即数不允许传给段寄存器
(4)段寄存器之间不允许传送
(5)两操作数类型不匹配⑹目的操作数应为[BP]
⑺源操作数应为[BX+DI]
(8)立即数不能作目的操作数
2.3
Ieabx,table;获取table的首地址,BX=200H
moval,8;传送欲转换的数字,AL=8
xlat;转换为格雷码,AL=12H
2.4
堆栈是一种按先进后出”原则存取数据的存储区域。
堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POPO
2.5
movax,8057h
PuShaxmovax,0f79h
movax,8057h
PUShaxmovax,0f79hPUShaxpopbxpop[bx]2.6
AL=89hCFZFAL=12h10
AL=Oafh00
AL=Oafh10
AL=00h01
AL=Offh00
AL=00h01
;bx=0f79h
;DS:
[0f79h]=8057h
SFOFPF011
101
101
001
101
001
2.7
W=X+Y+24-Z
2.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
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存余数
2.10;
(1)XChg的操作数不能是立即数
(2不能对CS直接赋值
(3)两个操作数不能都是存储单元
(4)堆栈的操作数不能是字节量
(5)adc的操作数不能是段寄存器
(6)没有确定是字节还是字操作
(7)in不支持超过FFH的直接寻址
(8)OUt只能以AL/AX为源操作数
第二章(02)
2.11;
指令
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
Offffh
-
-
-
-
-
TeSt
ax,0f0f0h
Offffh
0
0
1
0
1
注意:
1.mov,not指令不影响标志位
第2章(03)
2.12;
指令
注释
执行结果CFOFSFZFPF
movsi,ax
si=ax
si=0008h-----
shlsi,1
si=2*ax
si=0010h00000
addsi,ax
si=3*ax
si=0018h00001
movdx,bx
dx=bx
dx=0010h-----
movcl,03h
cl=03h
shldx,cl
dx=8*bx
dx=0080h0U000
SUbdx,bx
dx=7*bx
dx=0070h00000
adddx,si
dx=7*bx+3*axdx=0088h00001
1.左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。
2.移位指令根据是否移入“倒CF,设置CF,根据移位后的结果影响SF,ZF,PF°根据最高符号位是否改变设置OF,如改变0F=1.
3.,U?
表示无定义,,-?
表示无影响。
2.13;
(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
⑵
数字O〜9的ASCII码是:
30h〜39h
非压缩BCD码的O〜9是:
Ooh〜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
2.14;
(1)用Sar编写
2.20;8086的条件转移的转移范围:
在当前指令地址的+127——128之内。
如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移
到范围外的目标地址。
2.21;(I)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(无符号数)v64h
2.23;
movcx,0不循环,因为一进入循环就判cx=0?
如cx=0就退出循环
delay:
IOOPdelay
2.24;
(1)若DX>DI,转到above执行
CmPdx,di
jaabove;=jnbeabove
(2)若AX>Sl,转到greater执行
CmPax,si
jggreater;=jnlegreater
(3)若CX=0,转到zero执行
CmPcx,0jcxzzero
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
2.25;答:
将首地址为array得20个字的数组求和,并将结果存入total单元中
2.26;
(1)
movsi,0movdl,string[si]movsi,5
movdh,string[si]⑵
XOrsi,si
moval,buffer[si]incSi
movah,buffer[si]movcl,4shlah,cloral,ahmovdl,alincSi
moval,buffer[si]incSi
movah,buffer[si]movcl,4shlah,cloral,ah‘movdh,al
⑶
testdx,0f000hjzzeromovax,-1jmpdone
;第1个字符送dl寄存器
;第6个字符送dh寄存器
;Si清零
;第一字节
;第二字节
;BCD码移到高半字节
;组合成压缩BCD码
;存入dl寄..
;第三字节
;第四字节
BCD码移到高半字节组合成压缩BCD码
;存入dh寄..
zero:
movax,0
done:
ret
⑷
leabx,buffer1
leadx,buffer2
movcx,8;8个字节
xorsi,si;si=0
clc;CF=0
⑸
movax,0b800h
movds,ax;段地址
xorsi,si;地址偏移量si=0xordx,dx;和的高字dx=0movcx,99;加的次数
movax,[si];
第一个数
again:
incSi
;指向下一个字单兀
incSi
addax,[si];
加下一个数
jncnoc
;无进位转
incdx;
有进位dx=dx+1
noc:
decCX
;次数-1
jnzcx,again;
非0继续加
ret
⑹
movsi,offsetString
movcx,8000h
;32k=2^15=8000h
again:
CmP[si],?
$?
jnznext
mov[si],20h
;if[si]=?
$?
[si]<--?
?
next:
incSi
loopagain
⑺
xorsi,si
;SiV--O
movcx,100
;循环次数
again:
decarray[si]
decCX
jnzagain
(8)
xorsi,si;SiV--O
coun:
CmPString[si],?
$?
jedone
incSi
jmpCOun
done:
ret
2..27;⑴使CF=O:
clc;andax,ax;orax,ax
(2)使AX=O:
xorax,ax;andax,0;movax,0
(3)同时使AX=O和CF=0:
andax,0;xorax,ax;SUbax,ax2.29;压缩BCD码加法:
AX^AX+BX
出口参数:
AX=BCD码和
2.34;okmsgdb,OK?
,$?
errmsgdb,Error!
OVerflOW!
?
,$?
movax,XSUbax,Yjooverflowmovdx,offsetokmsgjmpnext
overflow:
movdx,errmsg
next:
movah,9
int21h
错误:
movax,X
Subax,Y
jooverflow
movdx,offsetokmsg
okmsgdb,OK?
,$?
movdx,errmsg;错误1:
数据定义在代码中
movah,9
int21h
overflow:
errmsgdb,Error!
OVerfIOW!
?
,$?
movdx,errmsg;错误2:
缺少JMP指令
movah,9
int21h
2.37;;xt237.asm
.modelsmall
.stack
.data
arraydb255
db0
array1db255dup('$')
array2dbOdh,Oah,'$'
.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
.exitOend
第三章(01)
3.1;硬指令:
每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;伪指令:
伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。
3.2;
3.5;1.编辑文本编辑程序汇编语言源程序.asm
2.汇编汇编程序目标模块文件.obj
3.连接连接程序可执行文件.exe或.COm
4.调试调试程序应用程序
3.6;;xt236.asm简化段定义格式
.modelsmall;定义程序的存储模式(小模式).stack;定义堆栈段(默认1024个字节).data;定义数据段
str1ab?
InPutNUmber:
0~9:
?
0dh,0ah,?
$?
str2ab?
Error!
?
0dh,0ah,?
$?
.cade;定义代码段
.startup;说明程序的起始点,建立ds,ss的内容
movah,09h;显示str1字符串
movdx,offsetstr1
;如Zf=0,无键按下,等待
;有键按下,键值与,0?
比较
如V,0?
出错处理
;有键按下,键值与,9?
比较
如〉,9?
出错处理
;调用DOS显示字符功能,显示该数字
int21h
.exit0;终止程序执行,返回DOS
error:
movah,09h;出错,调用DOS功能显示str2字符串movdx,offsetstr2
int21h
jmpgetkey;等待按键
end;汇编结束
3.7;;xt307.asm
StaCkSegment
dw512dup(?
)
StaCkends
dataSegment
arraydb255
db0
array1db255dup('$')
array2dbOdh,Oah,'$'
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
3.9;
(1)movbytePtr[bx],1000;1000超出了一个字节范围
(2)movbx,offsetmyword[si];寄存器的值只有程序执行时才能确定,
;而OffSet是汇编过程计算偏移地址,故无法确定
;可以改为leabx,myword[si]
(3)CmPmybyte1,mybyte2;两个都是存储单元,指令不允许
(4)moval,mybyte1+mybyte2;变量值只有执行时才确定,汇编过程不能计
(5)Subal,myword
(6)jnzmyword址方式
;字节量AL与字量myword,类型不匹配
;JCC指令只有相对寻址方式,不支持间接寻
3.10;前者为“与”操作硬指令助记符,可汇编成机器代码。
后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。
3.11;注:
对于逻辑运算,有关操作数可化为二进制数。
(1)moval,23hAND45hOR67h;67h
⑵movax,1234h∕16+1Oh;133h
(3)movax,NOT(65535XoR1234h);1234h
⑷moval,LOW1234hORHlGH5678h;76h
(5)movax,23hSHL4;0234h
⑹movax,1234hSHR6;0048h
(7)moval,'a'AND(NOTca'-'A));41h
(8)moval,'H'OR00100000b;68h
(9)movax,(76543LT32768)XOR7654h;7654h
3.12;假设block开始的数据块有32个字节数据:
16个正数+100(64h),16个负数-48(0doh)
分别连续分布:
block
db16dup(100),16dup(-48)
;也可以是任意字节数据,随
意分布。
dplus
db32dup(?
)
;为正数预留存储空间
dminus
db32dup(?
)
;为负数预留存储空间
count
equ32
;字节数
3.15;mydatasegSegment
my1bdb‘PerSonalCOmPUter'
my2bdb20
my3bdb14h;20h
my4bdb00010100b
my5wdw20dup(?
)
my6cequ100;my6c=100
my7cequ
mydatasegends3.18;段地址:
表示标号所在代码段的段地址;
偏移地址:
表示标号所在代码段的段内偏移地址;
类型:
引用该标号时,表示它所在同一个段一一near类型,还是另外一个段far类型。
3.19;mydataSegmentORGlO0h
VARWDWl234H5678H
VARBDB3,4
AGLlN4
VARDDD12345678H
EVEN
BUFFDB10DUP(?
)
MESSDB'HELLo
MOVAX,OFFSETVARB+OFFSETMESS;AX=4+16H=1AH
MOVAX,TYFETYPEBUFF+TYPEMESS+TYPEVARDX=1+1+4=06H
MOVAX,SIZEVARW+SIZEBUFF+SIZEME;SSX=4+10+5=19=13H
AX=2+1=03H
AX=10+4=14=0EH
AX=FF02H(近)
AX=1BH
MOVAX,LENGTHVARW+LENGTHVARD
MOVAX,LENGTHBUFF+SIZEVARW
MOVAX,TYPEBIGIN
MOVAX,OFFSETBEGIN
3.25;.modelsmall
.stack
.data
numequ5
datalistdw-1,0,2,5,4,?
.code
.startup
movbx,offsetdatalist
movcx,num
xorax,ax
again:
addax,[bx]
incbx
incbx
loopagain
mov[bx],ax
.exit0
end
3.26;StaCkSegmentPara‘StaCk
dw512dup(?
)
StaCkends
dataSegment
dwordarraydb100dup(?
)
dataends
codeSegment‘code'
assumecs:
code,ds:
data,es:
data,ss:
StaCk
Org100hstart:
movax,datamovds,axmoves,axmovdi,offsetarraymoval,64hmovcx,100cld
repstosbmovax,4c00hint21h
codeendsendStart
3.27;
解答
;xt327.asm
.modelsmall
.stack256;定义堆栈段大小为256个字节
.data
anUmdd11223344h;定义两个双字的数(随意)
bnUmdd77553311h
SUmdd?
;定义结果,执行后为:
88776655h
.code
.startup
xorsi,Si;相对于变量的位移量清零movcx,2;分高低字分别相加,共两次
clc;清零Cf
again:
movax,anum[si];取第一个数的一个字(先低字
后高字)
adcax,bnum[si];取第二个数的一个字(先低字后高字)
movsum[si],ax;存和的一个字(先低字后高字)incSi;修改位移量指向下一个字(加2)
incSi
loopagain;CX=CX-I,ifcx<>0,jumpagain
.exit0
end
3.28;.startup
xorsi,Si;位移量清零
moval,bdata[si];取第一个数
4.3;思路:
设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。
这里仅列出代码段:
movbl,al;将al中的两组分开
andal,Of
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 钱晓捷 课后 答案 docx