微机原理及应用习题答案_微机原理及应用习题集
微机原理及应用习题答案由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“微机原理及应用习题集”。
《微机原理及应用》习题答案
第一章
1.11 请完成下列数制转换:
(1)将174.66D转换为对应的二进制和十六进制形式。
(2)将100011101011.01011B转换为对应的十进制和十六进制形式。(3)将F18A6.6H转换为对应的二进制和十进制形式。答:174.66D=10101110.1010B=AE.AH 100011101011.01011B=2283.34375D=8EB.58H F18A6.6H=989350.375D
1.12 请写出与数据+37和-37对应的8位机器数原码、反码和补码,并分别用二进制和十六进制表示出来。
答:-37D=(10100101B)原=(11011010B)反=(11011011B)补
1.13 8位机器数46H,若作为无符号数和补码有符号数,其对应的真值各是什么?若作为BCD码和ASCII码,其对应的又是什么?
答:无符号数46H=70,补码46H=+70
BCD码46H=46,ASCII码46H=“F”
第二章
2.5什么是8088中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?1MB最多能分成多少个逻辑段?请将如下逻辑地址用物理地址表达:
(1)FFFFH:0H(2)40H:17H(3)2000H:4500H
(4)B821H:4567H 答:⑴ FFFFH:0H = FFFF0H
⑵ 40H:17H = 00417H
⑶ 2000H:4500H = 24500H
⑷ B821H:4567H = BC777H 2.8已知DS=2000H,BX=0100H,SI=0002,存储单元[20100H]~[20103H]依次存放12H,34H,56H,78H,[21200H]~[21203H]依次存放2AH,4CH,87H,65H,说明下列每条指令执行完后AX寄存器的内容以及源操作数的寻址方式? 答:⑴ AX=1200H,立即数寻址;
⑵ AX=0100H,寄存器寻址;
⑶ AX=4C2AH,直接寻址;
⑷ AX=3412H,寄存器间接寻址;
⑸ AX=4C2AH,寄存器相对寻址;
⑹ AX=7865H,基址变址寻址;
⑺ AX=65B7H,基址变址相对寻址。2.9 说明下面各条指令的具体错误原因:
(1)mov cx,dl(2)mov ip,ax(3)mov es,1234h(4)mov es,ds
(5)mov al,300(6)mov [sp],ax(7)mov ax,bx+di(8)mov 20h,ah 答: ⑴操作数类型不同;
⑵不能手工修改IP;
⑶不能将立即数直接MOV到段寄存器;
⑷不能在段寄存器之间直接MOV数据;
⑸300大于AL所能存放的数据的范围;
⑹寄存器间接寻址只能用BX/BP/SI/DI之一;
⑺MOV AX,[BX+DI];
⑻目的操作数不能是立即数。
2.10 已知数字0~9对应的格雷码依次为:18H,34H,05H,06H,09H,0AH,0CH,11H,12H,14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。lea
bx,table mov al,8
xlat
答:
lea
bx,table ;bx=0200h mov al,8
;al=08h xlat
;al=12h 2.11给出下列各条指令执行后的AL值,以及CF,ZF,SF,OF和PF的状态: mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al 答:⑴ al=89h ⑵ al=12h,CF=1,ZF=0,SF=0,OF=1,PF=1,AF=1 ⑶ al=afh,CF=0,ZF=0,SF=1,OF=0,PF=1,AF=0 ⑷ al=afh,CF=1,ZF=0,SF=1,OF=1,PF=1,AF=0 ⑸ al=00h,CF=0,ZF=1,SF=0,OF=0,PF=1,AF=0 ⑹ al=ffh,CF=0,ZF=0,SF=1,OF=0,PF=1,AF=1
⑺ al=00h,CF=0,ZF=1,SF=0,OF=0,PF=1,AF=1 2.12请分别用一条汇编语言指令完成如下功能:
(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加并把结果送到AL中。用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内
容相加,并把结果送回存储器中。
(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果
送回该存储单元中。
(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。答:
⑴ add dx,bx;
⑵ add al,[bx+si];
⑶ add [bx+00b2h],cx
⑷ add word ptr [0520h],3412h ⑸ add al,0a0h 2.13设X,Y,Z,V均为16位带符号数,分别装在X,Y,Z,V存储器单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。mov ax,x imul y mov cx,ax mox bx,dx mov ax,z cwd add cx,ax adc bx,dx sub cx,540 abb bx,0 mov ax,v cwd sub ax,cx abb dx,bx idiv x 答:(V -(X * Y + Z - 540))/ X 2.14给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax test ax,0f0f0h 答:⑴ ax=1470h ⑵ ax=1470h,CF=0,ZF=0,SF=0,OF=0,PF=0 ⑶ ax=1470h,CF=0,ZF=0,SF=0,OF=0,PF=0 ⑷ ax=0000h,CF=0,ZF=0,SF=0,OF=1,PF=1
⑸ ax=0ffffh,CF=0,ZF=0,SF=0,OF=1,PF=1 ⑹ ax=0ffffh,CF=0,ZF=0,SF=1,OF=0,PF=12.16假设DS=2000H,BX=1256H,TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么? 答:⑴ 1256h; ⑵ 3280h 2.17判断下列程序段跳转的条件(1)xor ax,leleh je equal(2)test al,10000001b jnz there(3)cmp cx,64h jb there 答:⑴ ax=1e1eh; ⑵ al=1******1b; ⑶ cx
xor cx,cx delay: nop
loop delay 答:65536 2.19 有一个首地址为array的20个字的数组,说明下列程序段的功能。
mov cx,20 mov ax,0 mov si,ax sumlp: add ax,array[si]
add si,2
loop sumlp
mov total,ax 答:将array数组的20个字(无进位)累加,其和存入total单元。2.20按照下列要求,编写相应的程序段:
(1)由string指示的起始地址的主存单元中存放一个字符串(长度大于6),把该字符串的第1个和第6个字符(字节量)传送给DX寄存器。
(2)有两个32位数值,按“小端方式”存放在两个缓冲区buffer1和 buffer2中,编写程序段完成DX.AX←buffer1-buffer2功能。
(3)编写一个程序段,在DX高4位全为0时,使AX=0;否则,使AX=-1。
(4)把DX.AX中的双字右移4位。
(5)有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出或借位)存于原处。答:
⑴ mov dl,string
mov dh,string+5 ⑵ mov ax,word ptr buffer1
sub ax,word ptr buffer2
mov dx,word ptr buffer1+2
sbb dx,buffer2+2 ⑶
test dx,0f0h
je
t1
mov ax,-1
jmp
done t1: mov ax,0 done: …..⑷ mov ax,1234h
mov dx,5678h
mov cx,4 lp1:
shr
dx,1
⑸
rcr
ax,1 loop lp1 lea bx,array mov cx,100 lp1:
sub [bx],1
inc
bx
loop lp1 2.25编写一个程序段:先提示输入数字“Input Number:0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!”,继续等待输入数字。答:
.model
small.stack
100h.data
meage
db “Input
Number : 0~9”,0dh,0ah,“$”
error
db “Error!”,0dh,0ah,“$”
.code.startup
mov
dx,offset meage
mov
ah,09h
int
21h begin1:
mov
ah,01h
int
21h
cmp
al,“0”
jb
err1
cmp
al,“9”
ja
err1
mov
dl,al
mov
ah,02h
int
21h.exit err1:
mov
offset error
mov
ah,09h
int
21h
jmp
begin1 end
第三章
3.11请设置一个数据段,按照如下要求定义变量:
(1)my1b为字符串变量,表示字符串“Personal Computer”。(2)my2b为用十进制数表示的字节变量,这个数的大小为20。(3)my3b为用十六进制数表示的字节变量,这个数的大小为20。(4)my4b为用二进制数表示的字节变量,这个数的大小为20。(5)my5w为20个未赋值的字变量。(6)my6c为100的符号常量。
(7)my7c为字符串常量,代替字符串“Personal Computer”。答:
my1b
db “Personal Computer” my2b
db 20 my3b
db 14h my4b
db 00010100b my5w dw 20 dup(?)my6c
equ 100 my7c
equ 3.14设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:
;数据段
org 100h varw
dw 1234h,5678h varb
db 3,4 vard
dd 12345678h buff
db 10 dup(?)me
db „hello‟
;代码段
mov ax,offset me
mov ax,type buff+type me+type vard
mov ax,sizeof varw+sizeof buff+sizeof me
mov ax,lengthof varw+lengthof vard 答:
offset varb = 0104h offset me = 0114h type buff = 1;type me = 1; type vard = 4 sizeof varw = 4;sizeof buff = 10; sizeof me = 5 lengthof varw =2;lengthof vard = 1 3.15假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的具体错误原因。(1)mov byte ptr [bx],1000(2)mov bx,offset myword[si](3)cmp mybyte1, mybyte2(4)mov mybyte1,al+1(5)sub al,myword(6)jnz myword 答:
⑴1000大于字节变量所能表示的范围 ⑵OFFSET只能用于简单变量 ⑶双操作数不能同时为存储器操作数 ⑷数值表达式应为运算符加常量 ⑸两操作数类型不一致 ⑹条件跳转只能是短跳转
3.17已知用于LED数码管的显示代码表为: LEDtable
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
db 80h,90h,88h,83h,0c6h,0c1h,86h,8eh 它依次表示0~9,A~F这16个数码的显示代码。现编写一个程序实现将lednum中的一个数字(0~
9、A~F)转换成对应的LED显示代码。答:
stack segment stack
db 100h dup(?)stack ends
data segment ledtable db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
db 80h,90h,88h,83h,0c6h,0c1h,86h,8eh lednum
db 3 data ends
code segment 'code' aume cs:code,:stack,ds:data start: mov ax,data mov ds,ax
lea bx,ledtable mov al,lednum xlat
mov ax,4c00h int 21h code ends end start 3.18编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位有符号数。答:
data segment x
db 13 y
db-3 z
db ? data ends
stack segment stack
db 100 dup(?)stack ends
code segment 'code' aume cs:code, ds:data, :stack start: mov ax,data mov ds,ax
mov al,x mov ah,y cmp al,ah jbe change mov z,ah jmp done change: mov z,al done: mov ax,4c00h int 21h code ends end start 3.19设变量bufX为有符号数16位数,请将它的符号状态保存在signX,即:如果变量值大于等于0,保存0;如果X小于0,保存-1.编写该程序。答:
data segment buffx dw 13 signx dw ? data ends
stack segment stack
db 100 dup(?)stack ends
code segment 'code' aume cs:code, ds:data, :stack
start: mov ax,data mov ds,ax
mov ax,buffx cmp ax,0 jbe change mov signx,0 jmp done change: mov signx,-1 done: mov ax,4c00h int 21h code ends end start 3.20 bufX、bufY和bufZ是3个有符号十六进制数,编写一个比较相等关系的程序:(1)如果这3个数都不相等,则显示0。(2)如果这3个数中有两个数相等,则显示1。(3)如果这3个数都相等,则显示2。答:
data segment bufx
db bufy
db bufz
db data ends
stack segment stack
db 100 dup(?)stack ends
code segment 'code' aume cs:code, ds:data, :stack
start: mov ax,data mov ds,ax
mov al,bufx mov bl,bufy mov cl,bufz
cmp al,bl je
cac cmp al,cl je
view1 cmp bl,cl je
view1 mov dl,'0' jmp view 13-3-3
cac: cmp al,cl je
view2 view1: mov dl,'1' jmp view view2: mov dl,'2'
view: mov ah,02h int 21h
mov ax,4c00h int 21h code ends end start 3.21例3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段? 答:
data segment number db 78h addrs dw offset fun0, offset fun1, offset fun2, offset fun3,offset fun4, offset fun5, offset fun6, offset fun7 data ends
stack segment stack
db 100 dup(?)stack ends
code segment 'code' aume cs:code, ds:data, :stack start: mov ax, data mov ds, ax
mov dh, number mov cx, 8 mov bx, 0 lp1: shr dh, 1 jc
next
again: inc bx inc bx loop lp1 jmp done next: jmp addrs[bx]
fun0: mov dl, '0' jmp view fun1: mov dl, '1' jmp view fun2: mov dl, '2' jmp view fun3: mov dl, '3' jmp view fun4: mov dl, '4' jmp view fun5: mov dl, '5' jmp view fun6: mov dl, '6' jmp view fun7: mov dl, '7' jmp view
view: mov ah, 02h int 21h jmp again
done: mov ax, 4c00h int 21h
code ends end start 3.22编制程序完成12H, 45H, F3H, 6AH, 20H, FEH, 90H, C8H, 57H和34H共10个无符号字节数据之和,并将结果存入字节变量SUM中(不考虑进位)。答:
data segment num db 12h, 45h, 0f3h, 6ah, 20h, 0feh, 90h, 0c8h, 57h, 34h sum db ? data ends
stack segment stack
db 100 dup(?)stack ends
code segment 'code' aume cs:code, ds:data, :stack start: mov ax, data mov ds, ax
mov cx, 10 lea bx, num
again: mov al, [bx] add sum, al inc bx loop again
mov ax, 4c00h int 21h code ends end start 3.23 求主存0040H:0开始的一个64KB物理段中共有多少个空格? 答:
stack segment stack
db 100 dup(?)stack ends
code segment 'code' aume cs:code, :stack start: mov ax, 0040h mov es, ax mov di, 0 mov cx, 0 mov bx, 0 mov al, ' ' again: scasb jne next inc bx next: dec cx jne again
mov ax, 4c00h int 21h code ends end start 3.24编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示 „overflow!‟。答:
data segment num dw 100 dup(800)sum dw ? msg db 'Overflow!', 13, 10, '$' data ends
stack segment stack
db 100 dup(?)stack ends
code segment 'code' aume cs:code, ds:data, :stack start: mov ax, data mov ds, ax
mov cx, 100 lea bx, num mov ax, 0
again: add ax, [bx] inc bx inc bx jc
err loop again
mov sum, ax jmp done err: mov dx, offset msg mov ah, 09h int 21h
done: mov ax, 4c00h int 21h code ends end start 3.25编制程序完成将一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;一次用余数除以100、10和1,得到“百位”、“十位”和“个位”。答:
data segment bnum dw 19982 dnum db 5 dup(?), '$' data ends
stack segment stack
db 100 dup(?)stack ends
code segment 'code' aume cs:code, ds:data, :stack
start: mov ax, data mov ds, ax
mov ax, bnum lea bx, dnum mov dl, 0 cwd mov cx, 10000 div cx add al, 30h mov [bx], al inc bx mov ax, dx
cwd mov cx, 1000 div cx add al, 30h mov [bx], al inc bx mov ax, dx cwd mov cx, 100 div cx add al, 30h mov [bx], al inc bx mov ax, dx cwd mov cx, 10 div cx add al, 30h mov [bx], al inc bx
add dl, 30h mov [bx], dl
mov dx, offset dnum mov ah, 09h int 21h
mov ax, 4c00h int 21h
code ends end
start 3.27编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。答:
stack segment stack
db 100h dup(?)stack ends
code
segment
start: mov ah, 07h int 21h
cmp al, 1bh je
done
push ax mov dl, al mov cl, 4 shr dl, cl call htoasc mov ah, 02h int 21h
pop ax mov dl, al and dl, 0fh call htoasc mov ah, 02h int 21h
jmp start
done: mov ax, 4c00h int 21h htoasc proc add dl, 30h cmp dl, 39h jbe htoend add dl, 7 htoend: ret htoasc endp 'code' aume cs:code, :stack
code
ends end
start 3.28请按如下说明编写子程序:
;子程序功能:把用ASCII码表示的两位十进制数转换位对应二进制数 ;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码 ;出口参数:AL=对应的二进制数 答:
stack segment stack ends
code
segment 'code' aume cs:code, :stack start: mov dx, 3932h call asctoh
mov ax, 4c00h int 21h
asctoh proc push cx sub dx, 3030h mov cl, 10 mov al, dh mul cl add al, dl pop cx ret asctoh endp stack
db 100h dup(?)code
ends end
start 3.29调用HTOASC子程序,编写显示一个字节的16进制数、后跟“H”的子程序。答:
stack segment stack
db 100h dup(?)stack ends
code
segment 'code' aume cs:code, :stack
start: mov ah, 07h int 21h
cmp al, 1bh je
done call htoah
jmp start
done: mov ax, 4c00h int 21h
htoah proc push ax push cx push dx push ax mov dl, al mov cl, 4 shr dl, cl call htoasc mov ah, 02h int 21h
pop ax mov dl, al and dl, 0fh call htoasc mov ah, 02h int 21h
mov dl, 'H' mov ah, 02h int 21h pop dx pop cx pop ax ret htoah endp
htoasc proc add dl, 30h cmp dl, 39h jbe htoend add dl, 7 htoend: ret htoasc
code
ends end
start 3.30写一个子程序,根据入口参数AL=0、1、2,依次实现对大些字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string中,用0表示结束。答:
data segment string db 'abcDEfGh', '$' data ends
stack segment stack
db 100 dup(?)stack ends
code
segment 'code' aume cs:code, ds:data, :stack start: mov ax, data mov ds, ax
mov al, 2 call change
mov dx, offset string mov ah, 09h int 21h
mov al, 0 call change
mov dx, offset string mov ah, 09h int 21h
mov al, 1 call change
mov dx, offset string endp mov ah, 09h int 21h
mov ax, 4c00h int 21h
change proc lea bx, string cmp al, 0 je
cg1 cmp al, 1 je
cg2 cg3: cmp byte ptr [bx], '$' je
done cmp byte ptr [bx], 5ah ja
xtod add byte ptr [bx], 20h jmp cg33 xtod: sub byte ptr [bx], 20h cg33: inc bx jmp cg3 cg2: cmp byte ptr [bx], '$' je
done cmp byte ptr [bx], 61h jb
cg22 sub byte ptr [bx], 20h cg22: inc bx jmp cg2 cg1: cmp byte ptr [bx], '$' je
done cmp byte ptr [bx], 5ah ja
cg11 add byte ptr [bx], 20h cg11: inc bx jmp cg1
done: ret change endp
code
ends end
start 3.34编写一个计算字节校验和的子程序。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。传递参数方法自定。答:
data segment count = 10 array db count dup(10h)check db ? data ends
stack segment stack ends
code segment 'code' aume cs:code, ds:data, :stack start: mov ax, data mov ds, ax
mov ax, count push ax mov ax, offset array push ax call sumcheck mov check, al
mov ax, 4c00h int 21h
sumcheck proc push bp mov bp, sp push bx push cx mov bx, [bp+4] stack
db 100 dup(?)mov cx, [bp+6] mov al, 0 sum1: add al, [bx] inc bx loop sum1 pop cx pop bx pop bp ret 4 sumcheck endp
code ends end
start