〔解答〕
lea bx,table mov al,8 xlat
;获取table的首地址,BX=200H ;传送欲转换的数字,AL=8 ;转换为格雷码,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
〔解答〕
mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al
;AL=89H ;AL=0AFH ;AL=0AFH ;AL=0FFH ;AL=00H
CF ZF SF OF PF
0 0 0 1 0 1
0 1 1 0 1 0
1 0 0 0 0 0
1 1 1 1 1 1
0 1 0 0
;AL=12H 1
;AL=00H 0
〔习题2.12〕
请分别用一条汇编语言指令完成如下功能:
⑴ 把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
⑵ 用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。
⑶ 用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。
⑷ 用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。
⑸ 把数0A0H与AL寄存器的内容相加,并把结果送回AL中 〔解答〕
⑴ add dx,bx ⑵ add al,[bx+si] ⑶ add [bx+0b2h],cx
⑷ add word ptr [0520h],3412h
6
⑸ add al,0a0h
〔习题2.13〕
设有4个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 sbb bx,0 mov ax,V cwd
sub ax,cx sbb 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
〔解答〕
mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax test ax,0f0f0h
;AX=1470H ;AX=1470H ;AX=1470H ;AX=0000H ;AX=FFFFH ;AX=FFFFH
7
CF ZF SF OF PF 0 0 0 0 0
0 0 1 1 0
0 0 0 0 1
0 0 0 0 0
0 0 1 1 1
〔习题2.15〕
控制转移类指令中有哪三种寻址方式? 〔解答〕
相对寻址、直接寻址、间接寻址(还可以分成寄存器间接、存储器间接)
〔习题2.16〕
假设DS=2000H、BX=1256H、TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?
⑴ JMP BX
⑵ JMP TABLE[BX] 〔解答〕
(1)1256H (2)3280H
〔习题2.17〕
判断下列程序段跳转的条件 ⑴ xor ax,1e1eh je equal
⑵ test al,10000001b jnz there ⑶ cmp cx,64h jb there 〔解答〕
⑴ AX=1e1eh(异或后为0) ⑵ AL的D0或D7至少有一位为1 ⑶ CX(无符号数)< 64h
〔习题2.18〕
如下是一段软件延时程序,请问NOP指令执行了多少次? xor cx,cx delay: nop loop delay 〔解答〕
216次
8
〔习题2.20〕
按照下列要求,编写相应的程序段:
⑴ 由string指示起始地址的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
⑵ 有两个32位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成DX.AX←buffer1-buffer2功能。
⑶ 编写一个程序段,在DX高4位全为0时,使AX=0;否则使AX=-1。 ⑷ 把DX.AX中的双字右移4位
⑸ 有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出或借位)存于原处。 〔解答〕
(1) mov dl,string[1] mov dh,string[6] (2) mov ax, word ptr buffer1 sub ax, word ptr buffer2 ; 先减低16位 mov dx, word ptr buffer1+2 sbb dx, word ptr buffer2+2 ; 后减高16位,需减低16位的借位 (3) test dx,0f000h jz next mov ax,-1 jmp done next: mov ax,0 done: … (4) mov cx,4
again: shr dx,1 ; 右移一位,移出的低位进入CF标志 rcr ax,1 ; 将CF移进AX高位,同时实现AX右移 loop again ; 循环4次,实现4位右移 (5) mov cx,100 mov bx,0
again: sub array[bx],1 inc bx
9
loop again
10