(4)ADD WORD PTR [0520H],3412H
(5)ADD AL,0A0H
〔习题2.9〕设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。
mov ax,X ;ax=X imul Y ;DX.AX=X*Y mov cx,ax ;cx=X*Y的低16位 mox bx,dx ;bx=X*Y的高16位 mov ax,Z ;ax=Z cwd
add cx,ax ;cx=Z的低16位+X*Y的低16位
adc bx,dx ;bx=Z的高16位+X*Y的高16位+低位进位 sub cx,540 ;cx=Z的低16位+X*Y的低16位-540
sbb bx,0 ;bx=Z的高16位+X*Y的高16位+低位进位-低位借位 mov ax,V ;ax=V cwd
sub ax,cx ;ax=V的低16位-(Z的低16位+X*Y的低16位-540)
sbb dx,bx ;dx=V的高16位-(Z的高16位+X*Y的高16位+低位进位-低位借位)-低位借位
idiv X ;/X〔解答〕 [V-(X*Y+Z-540)]/X AX存商,DX存余数
〔习题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的操作数不能是立即数 (2)不应对CS直接赋值
(3)两个操作数不能都是存储单元 (4)堆栈的操作数不能是字节量 (5)adc的操作数不能是段寄存器 (6)没有确定是字节还是字操作 (7)in不支持超过FFH的直接寻址
(8)out只能以AL/AX为源操作数
〔习题2.13〕编写程序段完成如下要求:
(1)用位操作指令实现AL(无符号数)乘以10
(2)用逻辑运算指令实现数字0 ~ 9的ASCII码与非压缩BCD码的互相转换 (3)把DX.AX中的双字右移4位〔解答〕 (1) ;不考虑进位 mov bl,al mov cl,3
shl al,cl ;*8 add al,bl ;shl bl,1 add al,bl ;考虑进位 xor ah,ah mov bx,ax mov cl,3 shl ax,cl
add ax,bx ;shl bx,1 add ax,bx
(2)数字0~9的ASCII码是:30h~39h 非压缩BCD码的0~9是:00h~09h 方法一:
and al,0fh ;实现ASCII到非压缩BCD码的转换 or al,30h ;实现非压缩BCD码到ASCII的转换 方法二:
xor al,30h ;求反D5D4位,其他不变 ;即高4位为3,则变为0;高4位为0,则变为3 (3) mov cl,4
again: shr dx,1 ;实现逻辑右移
;采用“sar dx,1”,则实现算术右移 rcr ax,1 dec cl jnz again
〔习题3.9〕假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误原因。
(1) mov byte ptr [bx],1000
(2) mov bx,offset myword[si] (3) cmp mybyte1,mybyte2 (4) mov al,mybyte1+mybyte2
(5) sub al,myword (6) jnz myword〔解答〕 (1)1000超出了一个字节范围
(2)寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,改为lea bx,myword[si]
(3)两个都是存储单元,指令不允许
(4)变量值只有执行时才确定,汇编过程不能计算 (5)字节量AL与字量myword,类型不匹配
(6)Jcc指令只有相对寻址方式,不支持间接寻址方式 习题3.14〕画图说明下列语句分配的存储空间及初始化的数据值:
(1) byte_var DB ?ABC?,10,10h,?EF?,3 DUP(-1,?,3 DUP(4))
(2) word_var DW 10h,-5,?EF?,3 DUP(?)〔解答〕 (1)从低地址开始,依次是(十六进制表达):
41 42 43 0a 10 45 46 ff - 04 04 04 ff - 04 04 04 ff - 04 04 04 (2)从低地址开始,依次是(十六进制表达): 10 00 FB FF 46 45 - - - - - -
〔习题3.19〕设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:
mydata segment
ORG 100H VARW DW 1234H,5678H VARB DB 3,4 ALIGN 4 VARD DD 12345678H EVEN BUFF DB 10 DUP(?) MESS DB ?HELLO?
BEGIN: MOV AX,OFFSET MESS
MOV AX,TYPE BUFF+TYPE MESS+TYPE VARD MOV AX,SIZEOF VARW+SIZEOF BUFF+SIZEOF MESS MOV AX,LENGTHOF VARW+LENGTHOF VARD MOV AX,LENGTHOF BUFF+SIZEOF VARW MOV AX,TYPE BEGIN
MOV AX, OFFSET BEGIN 〔解答〕
MOV AX, OFFSET MESS ;AX=116H
MOV AX, TYPE BUFF+TYPE MESS+TYPE VARD ;AX = 1+1+4 = 06H
MOV AX,SIZEOF VARW+SIZEOF BUFF+SIZEOF MESS ;AX = 4+10+5 = 19 = 13H MOV AX,LENGTHOF VARW + LENGTHOF VARD ;AX = 2+1 = 03H MOV AX,LENGTHOF BUFF + SIZEOF VARW ;AX = 10+4 =14 = 0EH MOV AX,TYPE BIGIN ;AX = FF02H (近)
MOV AX,OFFSET BEGIN ;AX = 1BH
习题3.25〕按下面要求写一个简化段定义格式的源程序
(1) 定义常量num,其值为5;数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;
(2) 代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。〔解答 .model small
.stack .data num equ 5 datalist dw -1,0,2,5,4,? .code .startup
mov bx,offset datalist mov cx,num xor ax,ax
again: add ax,[bx] inc bx inc bx loop again mov [bx],ax .exit 0 end
〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。 〔解答〕
思路: 首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成:
.model small .stack 256 .data
qvar dq 1234567887654321h .code .startup mov cx,7 mov si,1
again: mov al, byte ptr qvar[si] mov byte ptr qvar[si-1],al inc si loop again test al,80h jz ezz
mov bl,0ffh jmp done ezz: mov bl,0
done: mov byte ptr qvar[7],bl .exit 0
end
〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。 〔解答〕
思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次, 次低位字节至最高位字节依次带 CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。
.model small .stack 256 .data
qvar dq 1234567887654321h .code .startup
mov dx, 7 ;外循环次数 mov ax, byte ptr qvar[0] ;最低位字节送ax
lpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF位 mov si, 1
mov cx, 7 ;内循环次数
again: rcl byte ptr qvar[si], 1 ;高位字节依次左移 P50 inc si loop again dec dx jnz lpp .exit 0
.end
〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。〔解答〕
思路:设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。仅列出代码段: mov bl, al ;将al中的两组分开 and al, 0fh ;屏蔽高四位后送al
mov cl, 4 ;原al中的数据逻辑右移4次送bl shr bl, cl
mov dl, ah ;将ah中的两组分开 and dl, 0f0h ;屏蔽低高四位后送dl
mov cl, 4 ;原ah中的数据逻辑右移4次送dl shr dl, cl
mov cl, ah ;屏蔽高四位后送cl