计算机原理习题3含答案.docx
- 文档编号:13102380
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:17
- 大小:42.14KB
计算机原理习题3含答案.docx
《计算机原理习题3含答案.docx》由会员分享,可在线阅读,更多相关《计算机原理习题3含答案.docx(17页珍藏版)》请在冰点文库上搜索。
计算机原理习题3含答案
习题3:
1.编写程序段,将2个32位无符号数DAT1和DAT2相乘,结果保存在64位无符号数Result中;
2.有2个4字节无符号数分别存放在扩展段2000H和3000H开始的单元中,低位在前,高位在后,将两数相加,结果存放在数据段2000H开始的单元中,请编写程序段完成以上功能;
3.8086系统中,请说明下列指令的源操作数的寻址方式是什么?
1)MOVAX,1234H
2)MOVAX,[1234H]
3)MOVAX,[BX]
4)MOVAX,1234H[BX+SI]
5)MOVSB
6)INAL,DX
4.请在下表中画出下列数据段以十六进制表示的各单元值(表格中每个单元表示一个字节),并写出变量var1,var2,var3的偏移地址和cnt的值。
dataSEGMENTpara
ORG30H
var1DB-2,‘A’,2dup(‘23’)
var2DW-1
cntEQU$-var1
var3DWvar2
dataENDS
5.以下程序实现将变量var进行var*10+600的操作,并将计算结果保存在变量result中,当程序执行到地址M5的时候,请在以下表格中画出当前堆栈指针的位置和堆栈里的内容(程序断点可以用标号,在堆栈中可用寄存器名代表保存的内容,SS的内容不用指定,表格的每个单元表示一个字)。
(6分)
datasegment
vardw1000
resultdd?
dataends
ssegsegmentstack
db100dup(?
)
ssegends
codesegment
assumecs:
code,ds:
data,ss:
ss_seg
mainprocfar
pushds
movax,0
pushax
movax,data
movds,ax
movax,var
M1:
callCaculate
M2:
dw10
M3:
dw600
M4:
leabx,result
mov[bx],ax
mov[bx+2],dx
ret
mainendp
Caculateproc
pushbp
movbp,sp
pushsi
pushbx
movbx,[bp+2]
movsi,cs:
[bx]
mulsi
M5:
addax,cs:
2[bx]
adcdx,0
addbx,4
mov[bp+2],bx
popbx
popsi
popbp
ret
Caculateendp
codeends
endmain
6.问答题
1)若AL=81H,则执行指令CBW后AH的内容为多少?
2)若BL=BEH,执行下列指令序列,则每执行一步,BL和CF的值为多少?
SHLBL,1;BL=_____,CF=______
MOVCL,2
SHRBL,CL;BL=_____,CF=______
ORBL,80
SARBL,1;BL=_____,CF=______
RORBL,CL;BL=_____,CF=______
INCCL
RCLBL,CLBL=_____,CF=______
3)什么是短跳转、近跳转、远跳转?
4)若当前SP=1000H,CS=B000H,IP=0100H,且当前FLAG=2345H,则执行指令INT21H以后,SP的值变为多少?
堆栈段中6个存储单元0FFFH、0FFEH、0FFDH、0FFCH、0FFBH、0FFAH的值分别是多少?
7.请写出程序段实现下列功能
例如:
从160H端口读取1个字节
MOVDX,160H
INAL,DX
1)将一个8位数20H写入到地址为20H的端口;
2)若AL=56H,BL=57H,将这两个压缩格式BCD码相加并将结果保存到存储单元[2000H]中;
3)求数据段偏移地址为1000H开始的一个字符串的长度,字符串以ASCII码0为结束符,长度要求包括结束符;(提示:
初始化AL=0CX=0FFFFH,然后使用REPNZSCASB命令,最后根据CX的值计算字符串长度)
8.请判断以下8086汇编指令是否正确,正确则在指令前打√,错误则打×
()1)MOVDS,1000H()18)LEA[1000H],MSG
()2)MOVDX,1000H()19)LDSES,MSG
()3)MOVIP,AX()20)LESDX,MSG
()4)MOV[1000H],[SI]()21)ADDDS,1000H
()5)PUSH[SI]()22)ADCDX,[DI]
()6)PUSHAL()23)SUB[BX],1000H
()7)PUSH200H()24)SUB[BX+BP],1000H
()8)POPCS()25)IMUL100H
()9)POPAX()26)DIVwordptr100H[BP]
()10)XCHGAX,DS()27)ANDBP,1001H
()11)XCHGAX,1000H[SI+DI]()28)SHL[BX],1
()12)INAX,[SI]()29)RORAX,4
()13)INBL,80H()30)RCLwordptr[BX],CL
()14)INAX,160H()31)SARdwordptr[BX],CL
()15)INAL,DX()32)MOVSW
()16)OUTAL,DX()33)REPNZSCASB
()17)OUT80H,AL()34)RETI
习题3答案:
9.将2个32位无符号数DAT1和DAT2相乘,结果保存在64位无符号数中,请编写程序段。
datasegmentpara
dat1dd12345678H
dat2dd9ABCDEF0H
resultdq0
dataends
ss_segsegmentparastack
dw100dup(0)
ss_segends
codesegmentpara
assumecs:
code,ds:
data,ss:
ss_seg
mainprocfar
movax,data
movds,ax
leadi,dat1
leasi,dat2
leabx,result
movax,[si];取dat2的低16位
;dat1低*dat2低-->{dx,ax}
mulwordptr[di]
mov[bx],ax;保存结果
mov[bx+2],dx
movax,[si];再次取dat2低16位
;dat1高*dat2低-->{dx,ax}
mulwordptr[di+2]
add[bx+2],ax;保存结果
adc[bx+4],dx
adcwordptr[bx+6],0
movax,[si+2];取dat2的高16位
;dat1低*dat2高-->{dx,ax}
mulwordptr[di]
add[bx+2],ax
adc[bx+4],dx
adcwordptr[bx+6],0
movax,[si+2];再次取dat2的高16位
;dat1高*dat2高-->{dx,ax}
mulwordptr[di+2]
add[bx+4],ax
adc[bx+6],dx
movax,4c00h
int21h
mainendp
codeends
endmain
※补充:
将2个32位有符号数data1和data2相乘,结果保存在64位有符号数中result中,请编写完整汇编语言程序。
datasegmentpara
data1dd0FFFF8000H
data2dd0FFFF8000H
resultdq0
dataends
ss_segsegmentparastack
dw100dup(0)
ss_segends
codesegmentpara
assumecs:
code,ds:
data,ss:
ss_seg
mainprocfar
movax,data
movds,ax
leasi,data2;si-->data2
leadi,data1;di-->data1
leabx,result;bx-->result
testwordptr[si+2],8000h;判断data2是正数还是负数
jzmain1
movcl,1;cl=1,表明data2为负数
movax,0
movdx,0
subax,[si];求data2相反数
sbbdx,[si+2]
jmpmain2
main1:
movcl,0;cl=0,表明data2为正数
movax,[si]
movdx,[si+2]
main2:
pushdx;data2绝对值入栈
pushax
testwordptr[di+2],8000h;判断data1是正数还是负数
jzmain3
movch,1;ch=1,表明data1为负数
movax,0
movdx,0
subax,[di];求data1相反数
sbbdx,[di+2]
jmpmain4
main3:
movch,0;ch=0,表明data1为正数
movax,[di]
movdx,[di+2]
main4:
pushdx;data1绝对值入栈
pushax
callmul_u32;按32位无符号数相乘,得到相应结果
xorch,cl;ch为异或结果,若为0
;则data1*data2为正,否则为负
jzexit;结果若为正数,则直接返回
movax,0;否则对result求补
movdx,0
subax,[bx]
sbbdx,[bx+2]
mov[bx],ax
mov[bx+2],dx
movax,0
movdx,0
sbbax,[bx+4]
sbbdx,[bx+6]
mov[bx+4],ax
mov[bx+6],dx
exit:
movax,4c00h
int21h
mainendp
;功能:
实现两个32位无符号数相乘,利用堆栈传递参数
;输入参数:
bx-->result
;输出参数:
result中存放乘积
mul_u32proc
pushbp
movbp,sp
movax,[bp+8];取d2低16位
mulwordptr[bp+4];d1低16位*d2低16位-->{dx,ax}
mov[bx],ax;保存结果
mov[bx+2],dx
movax,[bp+8]
mulwordptr[bp+6];d1高16位*d2低16位-->{dx,ax}
add[bx+2],ax;保存结果
adc[bx+4],dx
adcwordptr[bx+6],0
movax,[bp+10];取d2高16位
mulwordptr[bp+4];d1低16位*d2高16位-->{dx,ax}
add[bx+2],ax
adc[bx+4],dx
adcwordptr[bx+6],0
movax,[bp+10]
mulwordptr[bp+6];d1高16位*d2高16位-->{dx,ax}
add[bx+4],ax
adc[bx+6],dx
popbp
ret8
mul_u32endp
codeends
endmain
10.有2个4字节无符号数分别存放在扩展段2000H和3000H开始的单元中,低位在前,高位在后,将两数相加,结果存放在数据段2000H开始的单元中,请编写程序段完成以上功能;
MOVAX,wordptrES:
[2000H]
ADDAX,wordptrES:
[3000H]
MOV[2000H],AX
MOVAX,wordptrES:
[2002H]
ADCAX,wordptrES:
[3002H]
MOV[2002H],AX
11.8086系统中,请说明下列指令的源操作数的寻址方式是什么?
1)MOVAX,1234H立即数寻址
2)MOVAX,[1234H]直接寻址
3)MOVAX,[BX]寄存器间接寻址
4)MOVAX,1234H[BX+SI]相对基址变址寻址
5)MOVSB数据串寻址
6)INAL,DXI/O端口间接寻址
12.请在下表中画出下列数据段以十六进制表示的各单元值(表格中每个单元表示一个字节),并写出变量var1,var2,var3的偏移地址和cnt的值。
dataSEGMENTpara
ORG30H
var1DB-2,‘A’,2dup(‘23’)
var2DW-1
cntEQU$-var1
var3DWvar2
dataends
var1:
0030Hvar2:
0036Hvar3:
0038Hcnt=8
13.以下程序实现将变量var进行var*10+600的操作,并将计算结果保存在变量result中,当程序执行到地址M5的时候,请在以下表格中画出当前堆栈指针的位置和堆栈里的内容(程序断点可以用标号,在堆栈中可用寄存器名代表保存的内容,SS的内容不用指定,表格的每个单元表示一个字)。
(6分)
datasegment
vardw1000
resultdd?
dataends
ssegsegmentstack
db100dup(?
)
ssegends
codesegment
assumecs:
code,ds:
data,ss:
ss_seg
mainprocfar
pushds
movax,0
pushax
movax,data
movds,ax
movax,var
M1:
callCaculate
M2:
dw10
M3:
dw600
M4:
leabx,result
mov[bx],ax
mov[bx+2],dx
ret
mainendp
Caculateproc
pushbp
movbp,sp
pushsi
pushbx
movbx,[bp+2]
movsi,cs:
[bx]
mulsi
M5:
addax,cs:
2[bx]
adcdx,0
addbx,4
mov[bp+2],bx
popbx
popsi
popbp
ret
Caculateendp
codeends
endmain
14.问答题
1)若AL=81H,则执行指令CBW后AH的内容为多少?
AH=0FFH
2)若BL=BEH,执行下列指令序列,则每执行一步,BL和CF的值为多少?
SHLBL,1;BL=__7CH___,CF=___1___
MOVCL,2
SHRBL,CL;BL=__1FH___,CF=___0___
ORBL,80
SARBL,1;BL=__2FH___,CF=___1___
RORBL,CL;BL=__CBH___,CF=___1___
INCCL
RCLBL,CL;BL=__5FH___,CF=___0___
3)什么是短跳转、近跳转、远跳转?
短跳转:
段内直接跳转,偏移量为-128~127
近跳转:
段内直接跳转,偏移量为-32768~32767
远跳转:
段间直接跳转
4)若当前SP=1000H,CS=B000H,IP=0100H,且当前FLAG=2345H,则执行指令INT21H以后,SP的值变为多少?
堆栈段中6个存储单元0FFFH、0FFEH、0FFDH、0FFCH、0FFBH、0FFAH的值分别是多少?
SP=0FFAH,(0FFFH)=23H(0FFEH)=45H
(0FFDH)=B0H(0FFCH)=00H
(0FFBH)=01H(0FFAH)=00H
15.请写出程序段实现下列功能
例如:
从160H端口读取1个字节
MOVDX,160H
INAL,DX
4)将一个8位数20H写入到地址为20H的端口;
MOVAL,20H
OUT20H,AL
5)若AL=56H,BL=57H,将这两个压缩格式BCD码相加并将结果保存到存储单元[2000H]中;
ADDAL,BL
DAA
MOV[2000H],AL
6)求数据段偏移地址为1000H开始的一个字符串的长度,字符串以ASCII码0为结束符,长度要求包括结束符;(提示:
初始化AL=0CX=0FFFFH,然后使用REPNZSCASB命令,最后根据CX的值计算字符串长度)
MOVAX,DS
MOVES,AX
MOVDI,1000H
MOVAL,0
MOVCX,0FFFFH
CLD
REPNZSCASB
NOTCX;或者MOVAX,0FFFFH
;SUBAX,CX
;此时CX中存放的就是字符串的长度;MOVCX,AX
16.
请判断以下8086汇编指令是否正确,正确则在指令前打√,错误则打×
()1)MOVDS,1000H()18)LEA[1000H],MSG
(√)2)MOVDX,1000H()19)LDSES,MSG
()3)MOVIP,AX(√)20)LESDX,MSG
()4)MOV[1000H],[SI]()21)ADDDS,1000H
(√)5)PUSH[SI](√)22)ADCDX,[DI]
()6)PUSHAL(√)23)SUB[BX],1000H
()7)PUSH200H()24)SUB[BX+BP],1000H
()8)POPCS()25)IMUL100H
(√)9)POPAX(√)26)DIVwordptr100H[BP]
()10)XCHGAX,DS(√)27)ANDBP,1001H
()11)XCHGAX,1000H[SI+DI](√)28)SHL[BX],1(编译时会警告)
()12)INAX,[SI]()29)RORAX,4
()13)INBL,80H(√)30)RCLwordptr[BX],CL
()14)INAX,160H()31)SARdwordptr[BX],CL
(√)15)INAL,DX(√)32)MOVSW
()16)OUTAL,DX(√)33)REPNZSCASB
(√)17)OUT80H,AL()34)RETI
以上除了打√的指令外,其余指令全部为×
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 原理 习题 答案
![提示](https://static.bingdoc.com/images/bang_tan.gif)