(3) 从右到左把BUFF中的字符串传送到STR1。 MOV AX,DATA MOV DS,AX MOV ES,AX STD
LEA SI,STR1-1 LEA DI,LEN-1
MOV CX,STR1-BUFF REP MOVSB
(4) 比较BUFF与STR1两个字符串是否相等,如相等则DX=1,否则DX=0。 MOV AX,DATA MOV DS,AX MOV ES,AX CLD
LEA SI,BUFF LEA DI,STR1
MOV CX,STR1-BUFF REPE CMPSB
(5) 查找BUFF中有无字符$,把字符$出现的次数计入BX寄存器。 MOV AX,DATA MOV ES,AX MOV BX,0 CLD
MOV AL,‘$’ LEA SI,BUFF
MOV CX,STR1-BUFF NEXT: REPNE SCASB JCXZ NO-FOUND INC BX JMP NEXT
3.22 对于给定的AX和BX的值,执行下列程序段,程序将转向哪里?
ADD AX, BX
JNO L1
JNC L2
SUB AX,BX JNC L3 JNO L4 JMP L5
(1) AX=1234H, BX=6789H (2) AX=9200H, BX=4000H (3) AX=420EH, BX=8031H
(4) AX=E002H, BX=8086H L1,L1,L1,L5
3.23 下面不完整的程序段是比较AX和BX的值,把其中大的数送MAX变量。如果是无符号数,应如何填写指令?如果是有符号数,应如何填写指令?
CMP AX,BX
( JB L1 ) 有符号数:JL L1 MOV MAX,AX
( JMP L2 ) L1:MOV MAX,BX L2:HLT
3.24 在下列程序段的括号中分别填入如下指令,程序执行完后,AX、CX的内容是什么?
(1) LOOP (2) LOOPE (3) LOOPNZ MOV AX, 8
MOV CX,5 L1:SHL AX,CL
( )
提示:上机,SHL指令使ZF=0,LOOPE指令不可能循环。
3.25 测试AL寄存器,如果最高位和最低位同时为0,则转L0,如果最高位和最低位只有一位为1,则转L1,如果最高位和最低位同时为1,则转L2。画出流程图,并编写程序段。
ROL AL,1 AND AL,3 JZ L0 SUB AL,3 JZ L3 JMP L2
3.26 从键盘输入一个英文字母,显示输出其大写。画出流程图,并编写程序段。
3.27 从键盘输入一位数字N,显示输出N个N。画出流程图,并编写程序段。
CODE SEGMENT ASSUME CS:CODE START: MOV AH,1 INT 21H MOV DL,AL AND AL, 0FH MOV CL,AL MOV CH,0
NEXT: MOV AH,2 INT 21H
LOOP NEXT MOV 4CH INT 21H CODE ENDS END START
3.28 寄存器中为压缩的BCD码表示的十进制数,写出指令完成十进制加减计算,即计算AL+BL;AL-BL。并在DEBUG下上机验证。
(1) AL=65H,BL=37H (2) AL=98H,BL=69H
3.29 寄存器中为非压缩的BCD码表示的十进制数,写出指令完成十进制加减计算,即计算AL+BL;AL-BL。并在DEBUG下上机验证。
(1) AX=235H,BL=37H (2) AL=238H,BL=39H
3.30 用相对基址比例变址寻址方法求ARRAY行列式的值。 ARRAY DW 2,3,5 DW 1,4,6 DW 2,7,9
习题4
4.1 假设VAR1为字节变量,VAR2为字变量,LAB为标号,VAL为常量,指出下列有错误的指令,说出原因,并予纠正。
(1) ADD AX,VAR1 / ADD AL,VAR1 (2) MOV VAR2,VAR1 / MOV VAR2,AX (3) MOV VAR1,BYTE PTR VAR2 / MOV VAR1,AL
(4) MOV VAR1,OFFSET VAR2 / MOV VAR2,OFFSET VAR1 (5) MOV VAR2,OFFSET VAR1
(6) MOV VAR1,VAR2+VAR1 / MOV VAR2,VAR2-VAR1 (7) MOV VAR1,VAR2-VAR1 / MOV VAR2,VAR2-VAR1 (8) MOV VAR2,VAR2-VAR1
(9) MOV BX,VAR2+VAL-4*5 (10) MOV BX,TYPE VAL (11) MOV BX,LAB
(12) JMP VAR1 /JMP WORD PTR VAR1 (13) JMP VAR2
(14) JMP [VAL] /仅在DEBUG下可以
(15) MOV BL, VAR1 AND VAL / VAR1 AND VAL须用指令实现 (16) MOV BX, VAL AND 0FH (17) MOV BX, VAL LT 0FH
(18) MOV BL,LAB+VAR1 / MOV BL,VAR1
4.2 画图说明下列数据定义语句所示内存空间的数据,并回答寄存器的值。
ORG 0
ARRAY LABEL BYTE
DA1 DW 2,9,14,3,315H,-6 DA2 DB 7,‘ABCDEDFG’
LEN = $-DA2 ORG 100H DA3 DW DA4
DA4 DB 4 DUP(2 DUP(1,2,3),4)
MOV AL,ARRAY+2 (AL)=( )H ADD AL,DA2+1 (AL)=( )H MOV AX,DA2-DA1 (AX)=( )H MOV BL,LEN (BL)=( )H MOV AX, DA3 (AX)=( )H MOV BX, TYPE DA4 (BX)=( )H MOV BX, OFFSET DA4 (BX)=( )H MOV CX, SIZE DA4 (CX)=( )H MOV DX, LENGTH DA4 (DX)=( )H MOV BX, WORD PTR DA4 (BX)=( )H MOV BL, LEN AND 0FH (BL)=( )H MOV BL, LEN GT 5 (BL)=( )H MOV AX, LEN MOD 5 (AX)=( )H
4.3 变量和标号有哪些区别?变量和标号有哪些属性?如何获取属性值?写
出指令。
变量是为指令提供的操作数,标号是为指令提供标识,都是为了在指令中引用。它们最主要的属性有:偏移属性,段属性,类型属性。例如: MOV BX, OFFSET VAL ;取偏移属性 MOV BX, SEG VAL ;取段属性 MOV BX, TYPE VAL ;取类型属性
4.4 指令和伪指令的区别在哪里?伪指令可以出现在代码段吗?指令可以在数据段吗?
指令只能出现在代码段,定义数据的伪指令通常在数据段。伪指令不会生成指令。
4.5 下面的程序是否有错?能否通过汇编?程序运行的结果如何?程序的真正意图是什么?应如何修改程序才能实现真正意图?
答:通过汇编和连接可以运行,但程序真正意图是输出ASCII码为30H~39H的字符0~9,应作修改。
CODE SEGMENT
ASSUME CS:CODE
K=30H ;改为 K DB 30H J DW 0 START: MOV DL, K MOV AH, 2 INT 21H
K=K+1 ;K=K+1是伪指令,没生成代码,改为 INC K
INC J
CMP J, 10 JNZ START MOV AH, 4CH INT 21H CODE ENDS
END START
4.6 用32位指令编写完整程序,并上机调试,计算V=(X+Y)*R,其中所有变
量均为64位变量,X、Y、R的具体数值由你自己确定,变量定义格式如下:
X DD ?,? Y DD ?,? R DD ?,? V DD ?,? data segment x dd 1 y dd 2 r dd 3 v dd ?,? data ends
code segment
assume cs:code,ds:data .386p start:
mov ax,data mov ds,ax mov eax,x add eax,y mov ebx,r imul ebx mov v,eax mov v+4,edx mov dl,al add dl,30h mov ah,2 int 21h mov ah,4ch int 21h code ends end start

