MOV CL, 4
ROL AX,CL (AX)=2341H,CF=1,SF=0,ZF=0 DEC AX (AX)=2340H,CF=1,SF=0,ZF=0 MOV CX,4
MULL CX (AX)=8D00H, CF=0,SF=1,ZF=0
INT 20H
结束后,(DX)=0000H, (AX)=8000H
9. 试分析下列程序段:
ADD AX, BX JNC L2 SUB AX, BX JNC L3 JMP SHORTL5
如果AX,BX的内容给定如下:
AX BX (1) 14C6H 80DCH (2) B568H 54B7H
问该程序在上述情况下执行后,程序转向何处。 答:(1)转到L2处 (2)转到L3处
习题4
1.下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。
VAR1 DB 10,2
VAR2 DW 5 DUP(?),0
VAR3 DB ‘HOW ARE YOU?’,3 DUP(1,2) VAR4 DD -1,1,0 答:字节空间:
VAR1:2; VAR2:12; VAR3:13; VAR4:8。 存储空间的分配图:
2.假定VAR1 和VAR2 为字变量,LAB 为标号,试指出下列指令的错误之处。 (1)ADD VAR1,VAR2 (3)JMP LAB[CX]
(2)SUB AL,VAR1 (4)JNZ VAR1 (6)SHL AL, 4
(5) MOV [1000H],100
答:(1) 在算术运算指令中,两个操作数不能同时为存储器寻址方式 (2) AL 为字节,VAR1 为字变量,字长不相等;
(3) 错误1:寄存器相对寻址方式,只能使用基址或变址寄存器,不能使用CX寄存器。
错误2:汇编格式错误,无法判段是段内转移还是段间转移。 (4) 转向地址应为标号,不能是变量; (5) 目的操作数的类型不确定;
(6) SHL 指令中,当所移位数超过1 时,必须用CL取代所移位数。
3.对于下面的符号定义,指出下列指令的错误。
A1 DB ? A2 DB 10 K1 EQU 1024
(1) MOV K1,AX (2)MOV A1,AX (3)CMP A1,A2 (4)K1 EQU 2048 答:(1)K1 为常量,不能用MOV 指令赋值; (2)A1 为字节,AX 为字变量,类型不一致; (3)A1 和A2同为存储器寻址方式,不符合语法规则; (4)K1 重新赋值前,必须用PURGE 释放。
4.数据定义语句如下所示: FIRST DB 90H,5FH,6EH,69H SECOND DB 5 DUP(?) THIRD DB 5 DUP(?) FORTH DB 4 DUP (?)
自FIRST 单元开始存放的是一个四字节的十六进制数(低位字节在前),要求: 编一段程序将这个数左移两位后存放到自SECOND 开始的单元,右移两位后存放到自THIRD 开始的单元,求补后放到FORTH开始的单元。(注意保留移出部分) 答:
DATA SEGMENT
FIRST DB 90H,5FH,6EH,69H SECOND DB 5 DUP(?) THIRD DB 5 DUP(?) FORTH DB 4 DUP (?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA
MOV DS,AX LEA SI,FIRST LEA DI,SECOND MOV CX,2 CLC
;左移2 位
MOV AX,WORD PTR [SI] ;AX=5F90H 为低十六位数据 INC SI INC SI
MOV DX,WORD PTR [SI] ;DX=696EH 为高十六位数据 PUSH DX ;保存原有的高十六位数据 PUSH AX ;保存原有的低十六位数据 ROL DX,CL
;将高位数据不带进位循环左移两位,即高2 位数据在DL 的低
2 位
AND DL,03H ;让DL 中仅保存移出的高2 位数据 MOV [DI+4] ,DL;将移出的高2 位数据放入SECOND 中的最高单元中 ROL AX,CL
;将低位数据不带进位循环左移两位,即AX 的高2 位在AL 的
低2 位
AND AL,03H;让AL 中仅保存移出的AX 高2 位数据 MOV BL ,AL;将AL 中的数据放入BL 中保存 POP AX;弹出原有的低十六位数据 POP DX;弹出原有的高十六位数据
SHL DX,CL;将高位数据算术逻辑左移2 位 SHL AX,CL;将低位数据算术逻辑左移2 位
OR DL,BL;将AX 中移出的高2 位数据放入DX 的低2 位 MOV WORD PTR [DI] ,AX MOV WORD PTR [DI+2] ,DX
;右移2 位
LEA SI,FIRST LEA DI,THIRD MOV CX,2 CLC
MOV AX,WORD PTR [SI] ;AX=5F90H 为低十六位数据 INC SI INC SI
MOV DX,WORD PTR [SI] ; DX=696EH 为高十六位数据 PUSH DX;保存原有的高十六位数据 PUSH AX;保存原有的低十六位数据
ROR AX,CL;将低位数据不带进位循环右移两位,即低2 位数据在AH 的高2 位
AND AH,0C0H;让AH 中仅保存移出的低2 位数据 PUSH CX MOV CX,6 SHR AH,CL POP CX
MOV [DI] ,AH ;将移出的低2 位数据放入THIRD 中的最低单元中 ROR DX, CL
;将低位数据不带进位循环左移两位,即AX 的高2 位在AL 的
低2 位
AND DH,0C0H ;让DH 中仅保存移出的DX 低2 位数据 MOV BL ,DH ;将DH 中的数据放入BL 中保存 POP AX ;弹出原有的低十六位数据 POP DX ;弹出原有的高十六位数据 SHR DX,CL ;将高位数据算术逻辑左移2 位 SHR AX,CL ;将低位数据算术逻辑左移2 位
OR AH,BL ;将DX 中移出的低2 位数据放入AX 的高2 位 MOV WORD PTR [DI+1] , AX MOV WORD PTR [DI+3] ,DX