ch03汇编语言程序设计
1 CH03 汇编语言程序设计 习题与思考题 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 :19;VAR4 :12。 存储空间的分配图: DS:0000 0A 02 00 00 00 00 00 0000 00 00 00 00 00 48 4F 0010 57 20 41 52 45 20 59 4F55 3F 24 01 02 01 02 01 0020 02 FF FF FF FF 01 00 0000 00 00 00 00 2假定 VAR1和 VAR2为字变量, LAB为标号,试指出下列指令的错误之处。 (1)ADD VAR1 ,VAR2 (2)SUB AL,VAR1 (3)JMP LABCX (4)JNZ VAR1 (5) MOV 1000H ,100 ( 6)SHL AL , 4 解答: (1) 两个操作数中至少有一个为寄存器; (2)AL 为字节, VAR1为字变量,不匹配; (3)中不能用CX ; (4) 转向地址应为标号; (5) 目的操作数的类型不确定; (6)SHL 指令中,当所移位数超过1 时,必须用CL或 CX来取代所移位数。 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 未定义,无法做比较指令; (4)K1 重新赋值前,必须用PURGE 释放。 4数据定义语句如下所示: FIRST DB 90H,5FH,6EH ,69H SECOND DB 5 DUP() THIRD DB 5 DUP() 自 FIRST 单元开始存放的是一个四字节的十六进制数( 低位字节在前 ), 要求 : 编一段程序将这个数左移两位后存放到自SECOND 开始的单元 , 右移两位后存放到自 THIRD开始的单元。 ( 注意保留移出部分) 解答: DATA SEGMENT 2 FIRST DB 90H,5FH,6EH , 69H SECOND DB 5 DUP() THIRD DB 5 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 ,SI INC SI INC SI MOV DX ,SI PUSH DX PUSH AX ROL DX,CL AND DL, 03H MOV DI+4,DL ROL AX, CL AND AL, 03H MOV BL ,AL POP AX POP DX SHL DX, CL SHL AX,CL OR DL ,BL MOV DI ,AX MOV DI+2 , DX ;右移 2 位,类同左移的方法,略 MOV AH ,4CH INT 21H CODE ENDS END START 5 (原 14)在当前数据区从400H开始的 256 个单元中存放着一组数据,试编程序将 它们顺序搬移到从A000H开始的顺序256 个单元中。 解答: DATA SEGMENT ORG 400H DAT1 DB .;256 DUP () ORG 0A000H DAT2 DB .;256 DUP () 3 DATA ENDS STACK SEGMENT STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX ;CH3-14 LEA SI,DAT1 LEA DI,DAT2 MOV CX,128 AGAIN: MOV AL,SI MOV DI,AL INC SI INC DI LOOP AGAIN ;CH3-15, 将两个数据块逐个单元进行比较,若有错BL=00H ,否则 BL=FFH LEA SI,DAT1 LEA DI,DAT2 MOV CX,128 NEXT: MOV AL,SI MOV BL,DI CMP AL,BL JNZ ERROR INC SI INC DI LOOP NEXT MOV BL,0FFH JMP EXIT ERROR: MOV BL,00H EXIT: MOV AX,4C00H INT 21H CODE ENDS END START 6试编程序将当前数据区从BUFF开始的4K 个单元中均写入55H,并逐个单元读出 比较,看写入的与读出的是否一致。若全对,则将ERR单元置0H ;如果有错,则将ERR 单元置 FFH 。 解答: DATA SEGMENT BUFF DB 1000H DUP() ERR DB DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA 4 START: MOV AX,DATA M OV DS,AX ; 将 55H 依次放入 BUFF开始的 4K个单元 LEA SI,BUFF M OV CX,1000H M OV AL,55H NTXT: MOV SI,AL I NC SI LOOP NEXT ; 取出与 55H比较,全对则ERR=0 ,否则 ERR=FFH LEA DI,BUFF LEA SI,ERR M OV CX,1000H NEXT1: MOV AL,DI I NC DI CMP AL,55H JNZ ERROR ;若有一个不同,即置ERR=FFH LOOP NEXT1 M OV AL,00H MOV SI,AL;全比较完无错,则置ERR=0 JMP EXIT ERROR: MOV AL,0FFH M OV SI,AL ; 返回 DOS EXIT: MOV AH,4CH I NT 21H CODE ENDS END START END 7在上题中,如果发现有错时,要求在ERR单元中存放出错的数据个数,则程序该 如何修改 解答: DATA SEGMENT BUFF DB 1000H DUP() ERR DW DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA M OV DS,AX ; 将 55H 依次放入 BUFF开始的 4K个单元 LEA SI,BUFF M OV CX,1000H M OV AL,55H NTXT: MOV SI,AL I NC SI 5 LOOP NEXT ; 取出与 55H比较 LEA DI,BUFF LEA SI,ERR M OV DX,0000H M OV CX,1000H NEXT1: MOV AL,DI I NC DI CMP AL,55H JZ NEXT2 ;若相同,则比较下一个 I NC DX;否则将放出错个数的DX加 1 NEXT2 : LOOP NEXT1 M OV SI,DX EXIT: MOV AH,4CH I NT 21H CODE ENDS END START END 8试编写程序段, 完成将数据区从0100H开始的一串字节数据逐个从F0H端口输出, 已知数据串以0AH为结束符。(略) 9( 原 24) 内存中以FIRST 和 SECOND 开始的单元中分别存放着两个4 位用压缩BCD 码表示的十进制数, 低位在前。 编程序求这两个数的和,仍用压缩BCD码表示 , 并存到以 THIRD开始的单元。 解答: DATA SEGMENT FIRST DW 3412H SECOND DW 7856H THIRD DB , DATA ENDS STACK SEGMENT STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX LEA SI,FIRST LEA DI,SECOND LEA BX,THIRD MOV CX,2 CLC AGAIN: MOV AL,BYTE PTRSI MOV DL,BYTE PTRDI ADC AL,DL 6 DAA MOV BYTE PTRBX,AL INC SI INC DI INC BX LOOP AGAIN JC AA MOV BYTE PTRBX,0 JMP EXIT AA: MOV BYTE PTRBX,1 EXIT: MOV AX,4C00H INT 21H CODE ENDS END START 10( 原 27) 设字变量单元A、B、 C 存放有三个数,若三个数都不为零,则求三个数 的和,存放在D中;若有一个为零,则将其余两个也清零,试编写程序。 解答: DATA SEGMENT A DB B DB C DB D DW DATA ENDS STACK SEGMENT STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX LEA SI,A LEA DI,D MOV AL,SI CMP AL,00 JZ ZERO ADC DX,AL LEA SI,B MOV AL,SI CMP AL,00 JZ ZERO ADC DX,AL LEA SI,C MOV AL,SI CMP AL,00 JZ ZERO 7 ADC DX,AL MOV DI,DX JMP EXIT ZERO: MOV AL,0 MOV A,AL MOV B,AL MOV C,AL EXIT: MOV AX,4C00H INT 21H CODE ENDS END START 11(16) 试编程序,统计由TABLE开始的 128 个单元中所存放的字符“A”的个数, 并将结果存放在DX中。 解答: DATA SEGMENT TABLE DB X1,X2,.X128 DATA ENDS STACK SEGMENT STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX LEA SI,TABLE MOV DX,0 MOV CX,128 AGAIN: MOV AL,SI CMP AL,A JNZ NEXT INC DX NEXT: INC SI LOOP AGAIN MOV AX,4C00H INT 21H CODE ENDS END START 12试编制一个汇编语言程序,求出首地址为DATA的 10