IBM-PC汇编语言程序设计课后习题答案(第二版 沈美明))
第五章 5、1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
答:程序段如下:
BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用 INT 21H
CMP AL, ‘a’ ;输入字符<‘a’不? JB STOP
CMP AL, ‘z’ ;输入字符>‘z’不? JA STOP
SUB AL, 20H ;转换为大写字母,用AND AL, 1101 1111B也可 MOV DL, AL ;显示一个字符的DOS调用 MOV AH, 2 INT 21H JMP BEGIN STOP: RET
5、2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符与后续字符,再按顺序显示这三个字符。 答:程序段如下:
BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用 INT 21H
CMP AL, ‘a’ ;输入字符<‘a’不? JB STOP
CMP AL, ‘z’ ;输入字符>‘z’不?
IBM-PC汇编语言程序设计课后习题答案(第二版 沈美明))
JA STOP
DEC AL ;得到前导字符 MOV DL, AL ;准备显示三个字符 MOV CX, 3
DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用 INT 21H INC DL LOOP DISPLAY STOP: RET
5、3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL与DL中。 答:程序段如下: DSEG SEGMENT STORE DB 4 DUP (?) DSEG ENDS ┇
BEGIN: MOV CL, 4 ;右移四次 MOV CH, 4 ;循环四次 LEA BX, STORE A10: MOV DX, AX
AND DX, 0FH ;取AX的低四位 MOV [BX], DL ;低四位存入STORE中 INC BX
SHR AX, CL ;右移四次
IBM-PC汇编语言程序设计课后习题答案(第二版 沈美明))
DEC CH
JNZ A10 ;循环四次完了码?
B10: MOV DL, STORE ;四组数分别放在AL、BL、CL与DL中 MOV CL, STORE+1 MOV BL, STORE+2 MOV AL, STORE+3 STOP: RET
5、4 试编写一程序,要求比较两个字符串STRING1与STRING2所含字符就是否完全相同,若相同则显示‘MATCH’, 若不相同则显示‘NO MATCH’。 答:程序如下: DSEG SEGMENT
STRING1 DB ‘I am a student、’ STRING2 DB ‘I am a student!’ YES DB ‘MATCH’, 0DH, 0AH, ‘$’ NO DB ‘NO MATCH’, 0DH, 0AH, ‘$’ DSEG ENDS
;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, ES: DSEG START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX
IBM-PC汇编语言程序设计课后习题答案(第二版 沈美明))
MOV AX, DSEG
MOV DS, AX ;给DS赋值 MOV ES, AX ;给ES赋值 ;
BEGIN: LEA SI, STRING1 ;设置串比较指令的初值 LEA DI, STRING2 CLD
MOV CX, STRING2 - STRING1 REPE CMPSB ;串比较 JNE DISPNO
LEA DX, YES ;显示MATCH JMP DISPLAY
DISPNO: LEA DX, NO ;显示NO MATCH
DISPLAY: MOV AH, 9 ;显示一个字符串的DOS调用 INT 21H RET MAIN ENDP
CSEG ENDS ;以上定义代码段
;-------------------------------------------------------------------------- END START
5、5 试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。 答:程序段如下:
IBM-PC汇编语言程序设计课后习题答案(第二版 沈美明))
BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用 INT 21H SUB AL, ‘0’
JB STOP ;输入字符<‘0’不? CMP AL, 9 ;输入字符>‘9’不? JA STOP CBW
MOV CX, AX ;响铃次数N JCXZ STOP
BELL: MOV DL, 07H ;准备响铃
MOV AH, 2 ;显示一个字符的DOS调用,实际为响铃 INT 21H
CALL DELAY100ms ;延时100ms LOOP BELL STOP: RET
5、6 编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P与负数数组N,并分别把这两个数组中数据的个数显示出来。 答:程序如下: DSEG SEGMENT COUNT EQU 20
ARRAY DW 20 DUP (?) ;存放数组 COUNT1 DB 0 ;存放正数的个数 ARRAY1 DW 20 DUP (?) ;存放正数 COUNT2 DB 0 ;存放负数的个数