习题五
一、1. BAACA 6.CADAD 二、程序练习题
1.根据题目,写出相关伪指令:
(1) 定义数据段DATA,并在数据段中定义两个字单元X、Y,初始值都是0 答案:
DATA SEGMENT X DW 0 Y DW 0
DATA ENDS
(2) 定义一个字符串SRING,保存’Computer’ 答案:
SRING DB ’Computer’
(3) 定义有100个字节单元的COUNT数组,初始值均为空 答案:
COUNT DB 100 DUP(?)
(4) 用赋值伪指令定义PI为3.14 答案:
PI EQU 3.14
(5) 用类型操作符LABEL将VALUE单元定义为字节型 答案:VALUE LABEL BYTE
2.下列伪指令有错吗?如果有错,请指出错误原因。 答案:
(1) X1 DB 35H,0,-80 对。 (2) X2 DB 35,260,-1 错。
260超出了字节范围。
(3) X3 DB 1234H错。
X3是字节型,1234H是字型,不匹配。 (4) X4 DW 100 对。
(5) X5 DW 100(?) 错。缺少DUP。 (6) X6 DD ‘AB’ 对。
3.分析下列程序段执行情况,给出结果: (1)答案:
Z= (5+22-15)*14= 168 (2)答案:
累加和TOTAL=83 (3)答案:
功能:将X单元中的十六进制3AH变为十进制入栈保存,AH中为余数。先将0008H入栈,再将0005H入栈,结果为58。
三、简答题 1 1-4(略)
5.DOS功能AH=1和AH=8都是从键盘输入一个字符,它们有什么不同? 答:INT 21H 功能08的输入操作与功能01H相似,不同的是输入字符不回显。使用功能08功能不回显字符,但与01H一样,支持Ctrl_C或Ctrl_Break的中断处理。 四、编程题:
1.求两个数的平均值。这两个数分别存放在X单元和Y单元中,而平均值放在Z单元中。(略) 2.将字节变量VARY中两位十六进制数输出。 用分支结构实现:
MOV DL, VARY MOV CL, 4 ROL DL, CL AND DL, 0FH CMP DL, 0AH JB NUM ADD DL, 7 NUM: ADD DL, 30H MOV AH, 2 INT 21H
MOV DL, VARY AND DL, 0FH CMP DL, 0AH JB NUB ADD DL, 7 NUB: ADD DL, 30H MOV AH, 2 INT 21H
MOV DL, ‘H’ MOV AH, 2 INT 21H 用循环结构实现:
MOV BL,2 MOV DH, VARY LOP: MOV CL, 4 ROR DH, CL MOV DL, DH AND DL, 0FH CMP DL, 0AH JB NUM ADD DL, 7 NUM: ADD DL, 30H MOV AH, 2
INT 21H DEC BL JNZ LOP
MOV DL, ‘H’ MOV AH, 2 INT 21H
3.利用逐次求大数的方法对内存单元ARRAY开始的一字节为单位的无符号数进行从大到小排序。
DATA SEGMENT
ARRAY DB 49,38,65,12,97,13,55,27,28,85 DATA ENDS CODE SEGMENT
ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV DX, 9 LEA BX, ARRAY LOOP0: MOV AL, [BX] MOV SI, BX INC SI
MOV CX, DX
LOOP1: CMP AL, [SI] JAE NEXT
XCHG AL, [SI] NEXT: INC SI LOOP LOOP1 MOV [BX], AL INC BX DEC DX JNZ LOOP0
4.AX寄存器中存放着4位十六进制数,试编写程序将这4位十六进制数分别转换为相应的ASCII码,并依次存放到RESULT数组的4个字节中去,要求用子程序的方法实现。 DATA SEGMENT
HEXDATA DW 4D7EH RESULT DB 4 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV CX, 4
LEA SI, HEXDATA LEA DI, RESULT
NEXT:
MOV BX, [SI] MOV AX, BX AND AL, 0FH CALL HEXASC MOV [DI], AL INC DI PUSH CX MOV CX, 4 SHR BX, CL POP CX LOOP NEXT
LEA SI, RESULT+3
MOV CX, 4 STD
MOV AH, 4CH INT 21H
;十六进制转换成ASCII码子程序 HEXASC PROC CMP AL, 0AH JB PLUS30 ADD AL, 07H PLUS30: ADD AL, 30H RET
HEXASC ENDP CODE ENDS
END START
5.设有两个无符号数125和378,其首地址为x,求它们的和,将结果存放在SUM单元;并将其和转换为十六进制数且在屏幕上显示出来。 (略)
6.编制程序两个6字节数相加.将一个字节相加的程序段设计为子程序.主程序分3次调用该子程序,但每次调用的参数不同。 DATA SEGMENT
MYADD1 DB 0FEH,86H,7CH,35H,68H,77H MYADD2 DB 45H,0BCH,7DH,6AH,87H,90H SUM DB 6 DUP (0) COUNT DB 6 DATA ENDS STACK SEGMENT
DB 100 DUP ( ) STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK MADD: MOV AX,DATA MOV DS,AX
MOV AX,STACK MOV SS,AX
MOV SI,OFFSET MYADD1 MOV DI,OFFSET MYADD2 MOV BX,OFFSET SUM
MOV CX,COUNT ;循环初值为6 CLC
AGAIN: CALL SUBADD ;调用子程序 LOOP AGAIN ;循环调用6次 MOV AX,4C00H INT 21H
;子程序入口参数:SI,DI,BX 出口参数:SI,DI,BX SUBADD PROC ;完成一个字节相加 PUSH AX ;保护AX的值
MOV AL,[SI] ;SI是一个源操作数指针 ADC AL,[DI] ;DI是另一个源操作数指针 MOV [BX],AL ;BX是结果操作数指针 INC SI INC DI INC BX
POP AX ;恢复AX的值 RET SUBADD ENDP CODE ENDS END MADD 7.若有一串无符号数,放在NUM开始的单元中,要求编制汇编语言程序,将其中的最大值找出来,且放到存储单元MAX中,这串数的长度已存放在COUNT单元。 DATA SEGMENT COUNT DW 20
NUM DW 9,12,14,1,3,28,55,121,44,15,45
DW 34,67,87,90,32,43,59,60
MAX DW ? DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA MOV DS,AX
MOV BX,OFFSET NUM MOV CX,COUNT MOV AX,[BX] I INC BX INC BX
LOOP1: CMP AX,[BX] JAE LOOP2