(3) LEA SI,STRING ADD DI,SI
解:
取变量DATA1的值. 指令执行后,(AL)=10H.
变量DATA2的偏移地址. 指令执行后,(BX)=0003H.
(3)先取变量STRING的偏移地址送寄存器SI,之后送SI的内容与DI的内容相加并将结果送DI.指令执行后,(SI)=0017H;(DI)=(DI)+0017H.
4.3 试编写求两个无符号双子长数之和的程序. 两数分别在MEM1和MEM2单元中,和放在SUM单元. 解:
DSEG SEGMENT
MEM1 DW 1122H,3344H MEM2 DW 5566H,7788H SUM DW 2 DUP(?) DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX LEA BX,MEM1 LEA SI,MEM2 LEA DI,SUM MOV CL,2 CLC
AGAIN: MOV AX,[BX] ADC AX,[SI] MOV [DI],AX ADD BX,2 ADD SI,2 ADD DI,2 LOOP AGAIN HLT
CSEG ENDS END START
4.4试编写程序,测试AL寄存器的第4位(bit4)是否为0?
解: 测试寄存器AL中某一位是否为0,可使用TEST指令、AND指令、移位指令等几种方法实现。 如:TEST AL,10H JZ NEXT . . .
NEXT:…
或者: MOV CL,4 SHL AL,CL JNC NEXT
.
NEXT:…
4.5 试编写程序,将BUFFER中的一个8位二进制数转换为ASCII码,并按位数高低顺序存放在ANSWER开始的内存单元中。 解:
DSEG SEGMENT BUFFER DB ?
ANSWER DB 3 DUP(?) DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG START:MOV AX,DSEG MOV DS,AX
MOV CX,3 ;最多不超过3为十进制数(255) LEA DI, ANSWER ;DI指向结果存放单元 XOR AX,AX
MOV AL,BUFFER ;取要转换的二进制数 MOV BL,0AH ;基数10
AGAIN:DIV BL ;用除10取余的方法转换 ADD AH,30H ;十进制数转换成ASCII码 MOV [DI], AH ;保存当前的结果 INC DI ;指向下一个位保存单元
AND AL,AL ;商为0?(转换结束?) JZ STO ;若结束,退出 MOV AH,0
LOOP AGAIN ;否则循环继续 STO: MOV AX,4C00H INT 21H ;返回DOS CSEG ENDS END START
4.6 假设数据项定义如下:
DATA1 DB ?HELLO !GOOD MORNING !? DATA2 DB 20 DUP(?)
用串操作指令编写程序段,使其分别完成以下功能: (1)从左到右将DATA1中的字符串传送到DATA2中。
(2)传送完后,比较DATA1和DATA2中的内容是否相同。 (3)把DATA1中的第3和第4个字节装入AX。
(4)将AX的内容存入DATA2+5开始的字节单元中。 解: (1)
MOV AX,SEG DATA1 MOV DS,AX
MOV AX,SEG DATA2 MOV ES,AX LEA SI,DATA1 LEA DI,DATA2

