精品文档
mov ax,0f79h push ax
pop bx ;bx=0f79h pop [bx]
;DS:[0f79h]=8057h
2.6 给出下列各条指令执行后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 解答:
mov al,89h ;AL=89h CF ZF SF OF PF add al,al ;AL=12h 1 0 0 1 1 add al,9dh ;AL=0afh 0 0 1 0 1 cmp al,0bch;AL=0afh 1 0 1 0 1 sub al,al ;AL=00h 0 1 0 0 1 dec al ;AL=0ffh 0 0 1 0 1 inc al ;AL=00h 0 1 0 0 1
2.7 设X,Y,Z均为双字数据,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,它们的运算结果存入W单元。阅读以下程序段,给出运算公式。
Mov ax,X Mov dx,X+2 Add ax,Y Adc dx,Y+2 Add ax,24 Adc dx,0 Sub ax,Z Sbb dx,Z+2 Mov W,ax mov W+2,dx
解答:W=X+Y+24-Z
2.8 请分别用一条汇编语言指令完成如下功能:
(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
ADD DX,BX
(2)用寄存器BX和SI的基址变址寻址方式把存储器的1字节与AL寄存器的内容相加,并把结果送到AL中。
ADD AL,[BX+SI]
(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。
。 6欢迎下载
精品文档
ADD [BX+0B2H],CX
(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。
ADD WORD PTR [0520H],3412H
(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。
ADD AL,0A0H
2.9 设X,Y,Z,V均为十六位带符号数,分别装在X,Y,Z,V存储单元中,阅读以下程序段,得出它的运算公式,并说明运算结果存于何处。
Mov ax,X Imul Y Mov cx,ax Mov bx,dx Mov ax,Z Cwd
Add cx,ax Adc bx,dx Sub cx,540 Sbb bx,0 Mov ax,v Cwd
Sub ax,cx Sbb dx,bx Idiv X
2.10指出下列指令的错误 (1)xchg[si]30h (2)Pop cs
(3)Sub[si],[di] (4)Push ah (5)Adc ax,ds (6)Add [si],80h (7)In al,3fch (8)Out dx,ah
解答:(1)xchg [si],30h ;xchg的操作数不能是立即数 (2)pop cs ;不能对CS直接赋值
(3)sub [si],[di] ;两个操作数不能都是存储单元 (4)push ah ;堆栈的操作数不能是字节量 (5)adc ax,ds ;adc的操作数不能是段寄存器 (6)add [si],80h ;没有确定是字节还是字操作 (7)in al,3fch ;in不支持超过FFH的直接寻址 (8)out dx,ah ;out只能以AL/AX为源操作数
2.11 给出下列各条指令执行后的结果,以及状态标志CF,OF,SF,ZF,PF的状态。 Mov ax,1470h And ax,ax
。 7欢迎下载
精品文档
Or ax,ax Xor ax,ax Not ax
Test ax,0f0f0h
2.12假设例题2.34中的程序段中,AX=08h,BX=10H,请说明每条指令执行后的结果和各个标志位的状态
2.13编写程序段完成如下要求
(1)用位操作指令实现AL(无符号数)乘以10。 答 ;不考虑进位 ;考虑进位
xor ah,ah mov bl,al
mov bx,ax mov cl,3
mov cl,3 shl al,cl
add al,bl ;shl bl,1 shl ax,cl
add ax,bx ;shl bx,1 add al,bl
add ax,bx
(2)用逻辑运算指令实现数字0 到9的ASCII码与非压缩BCD码的互相转换。 答:数字0~9的ASCII码是:30h~39h
非压缩BCD码的0~9是:00h~09h 方法一: and al,0fh ;实现ASCII到非压缩BCD码的转换 or al,30h ;实现非压缩BCD码到ASCII的转换 (一)test al,30h jnz ASCII
or al,30h ;非压缩BCD码到ASCII的转换 jmp done
ASCII: and al,0fh ;ASCII到非压缩BCD码的转换 done: ... 方法二: xor al,30h ;求反D5D4位,其他不变
;即高4位为3,则变为0;高4位为0,则变为3
(3)把DX,AX中的双字右移4位。
答:mov cl,4
again: shr dx,1 ;实现逻辑右移 ;采用“sar dx,1”,则实现算术右移 rcr ax,1 dec cl jnz again
2.14已知AL=F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以2的程序段,并说明各自执行后,所得的商是什么?
2.15已知数据段500H到600H处存放了一个字符串,说明下列程序段执行后的结果:
Mov si,600h Mov di,601h
。 8欢迎下载
精品文档
Mov dx,ds Mov es,ax Mov cx,256 Std
Rep movsb
2.16说明下列程序段的功能 Cld
Mov ax,0fefh Mov cx,5 Mov bx,3000h Mov es,bx Mov di,2000h Rep stosw
2.17指令指针IP是通用寄存器还是专用寄存器?有指令能够直接赋值么?哪类指令的执行会改变它的值?
2.18控制转移指令中有哪三种寻址方式?
2.19什么是短转移 short jump、近转移near jump和远转移far jump?什么是段内转移和段间转移?8086有哪些指令可以实现段间转移?
2.20 8086的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移?
2.21假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,
[232F7H]=3280H,[264E5H]=2450H,试问执行下列段间接寻址的转移指令后,转移的目的地址是什么?
(1)JMP BX
(2)JMP TABLE[BX] (3)JMP [BX],[SI]
2.22判断下列程序段跳转的条件
(1)xor ax,leleh
Je equal
(2)test al,10000001b
Jnz there (3)cmp cx,64h
Jb there
答:(1) xor ax,1e1eh je equal
;AX=1e1eh(异或后为0) (2)test al,10000001b jnz there
;AL的D0或D7至少有一位为1 (3) cmp cx,64h jb there
;CX(无符号数)< 64h
2.23设置CX=0,则LOOP指令将循环多少次?例如:
。 9欢迎下载
精品文档
mov cx,0
Delay: loop delay
2.24假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较
指令和条件转移指令实现以下判断: (1)若DX>DI,转到above 执行 (2)若AX>SI,转到greater执行; (3)若CX=0,转到zero执行;
(4)若AX-SI产生溢出,转到overflow执行; (5)若SI<=AX,转到less_eq执行; (6)若DI<=DX,转到below_eq执行; 答:(1)若DX > DI,转到above执行 cmp dx,di
ja above ;=jnbe above
(2)若AX > SI,转到greater执行 cmp ax,si jg greater ;=jnle greater (3)若CX = 0,转到zero执行 cmp cx,0 jcxz zero jz zero
(4)若AX-SI产生溢出,转到overflow执行; cmp ax,di jo overflow
(5)若SI≤AX,转到less_eq执行; cmp si,ax cmp ax,si
jle less_eq jge less_eq
(6)若DI≤DX,转到below_eq执行。 cmp di,dx cmp dx,di
jbe below_eq jae below_eq
2.25有一个首地址为array 的20个字的数组,说明下列程序段的功能。
mov cx,20 Mov ax,0 Mov si,ax
Sum_loop:add ax,array[si]
Add si,2
Loop sum_loop Mov total,ax
2.26按照下列要求,编写相应的程序段:
(1)其实地址为string 的主存单元中存放有一个字符串(长度大于6),把该字符串的第一个和第六个字符(字节量)传送给DX寄存器。
(2)从主存buffer开始的4字节中保存了4个非压缩BCD码,现按低(高)地址对低(高)位的原则,将他们合并到DX中。
(3)编写一个程序段,在DX高4位全为0时,使用AX=0;否则AX=-1。
答:test dx,0f000h ;test dh,0f0h
。
10欢迎下载