汇编答案
- 格式:doc
- 大小:45.50 KB
- 文档页数:7
习题四
4.4 什么是“近程”转移?什么是“远程”转移?它们的实现方法有什么不同?
答:执行“近程”转移时,转移的目的地与出发地在同一个段内,它们具有相同的段基址。因此,为了实现“近程”转移,只需要改变IP寄存器的值。“远程”转移的目的地与出发地不在同一个段,为了实现这个转移,必须同时改变CS和IP寄存器的值。
4.5 已知(AX)= 836BH,X分别取下列值,执行“CMP AX, X”后,标志位ZF、CF、OF、SF各是什么?
(1)X=3000H (2)X=8000H (3)X=7FFFH (4)X=0FFFFH (5)X=0
答:上述指令执行后,标志位ZF、CF、OF、SF 的状态分别是:
(1) ZCOS=0010 (2) ZCOS=0000 (3) ZCOS=0010 (4) ZCOS=0101
(5) ZCOS=0001
4.6 已知(AX)= 836BH,X分别取下列值,执行“TEST AX, X”后,标志位ZF、CF、OF、SF各是什么?
(1)X=0001H (2)X=8000H (3)X=0007H (4)X=0FFFFH (5)X=0
答:上述指令执行后,标志位ZF、CF、OF、SF 的状态分别是:
(1) ZCOS=0000 (2) ZCOS=0001 (3) ZCOS=0000 (4) ZCOS=0001
(5) ZCOS=1000
4.7 测试名为X的一个字节,如果X的第1,3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0,转移到L3。写出对应的指令序列。
答: MOV AL, X
AND AL, 0000 1010B
JZ L3
CMP AL, 0000 1010B
JE L1
JMP L2
4.9 编写指令序列,将AX和BX中较大的绝对值存入AX,较小的绝对值存入BX。
答: AND AX, AX
JGE SKIP1
NEG AX
SKIP1: AND BX, BX
JGE SKIP2
NEG BX
SKIP2: CMP AX, BX
JGE SKIP3
XCHG AX, BX
SKIP3: ……
4.10 编写指令序列,比较AX、BX中的数的绝对值,绝对值较大的数存入AX,绝对值较小的数存入BX。
答: PUSH AX
PUSH BX
AND AX, AX
JGE SKIP1
NEG AX
SKIP1: AND BX, BX
JGE SKIP2
NEG BX
SKIP2: CMP AX, BX
POP BX
POP AX
JGE SKIP3
XCHG AX, BX
SKIP3: ……
4.11 编写指令序列,如果AL寄存器存放的是小写字母,把它转换成大写字母,否则不改变AL内容。
答: CMP AL, ‘a’
JB DONE
CMP AL, ‘z’
JA DONE
SUB AL, ‘a’-‘A’
DONE: ……
4.12 计算分段函数:2653XXY
3322XXX
X的值从键盘输入,Y的值送显示器输出。
答: INCLUDE YLIB.H
DATA SEGEMNT
MESS1 DB 0DH, 0AH, ‘Input value of X please : $’
MESS2 DB 0DH, 0AH, ‘ Y= : $’
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
LEA DX, MESS1 CALL READINT ;输入X的值
CMP AX, -2
JGE L2
L1: SUB AX, 3 ;AX←X-3
JMP DONE
L2: CMP AX, 3
JG L3
MOV BX, AX
ADD AX, AX ;AX←2X
ADD AX, AX ;AX←4X
ADD AX, BX ;AX←5X
ADD AX, 6 ;AX←5X+6
JMP DONE
L3: MOV AX, 2 ;AX←2
DONE:
LEA DX, MESS2
CALL WRITEINT ;输出Y的值
CALL CRLF
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
4.14 编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。
答: DATA SEGEMNT
LIST DW -56, +12, 88, -126, -5, 16, 32, -99, 72, -18
MIN DW ?
MINABS DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, LIST
MOV MIN, AX ;将数组第一个元素假设为绝对值最小的数
MOV MINABS, 32767 ;最小的绝对值假设为32767
LEA SI, LIST
MOV CX, 10
AGAIN: MOV AX, [SI]
CMP AX, 0
JGE SKIP1
NEG AX ;求绝对值 SKIP1: CMP AX, MINABS ;绝对值与假设的最小绝对值比较
JGE SKIP2 ;假设的绝对值较小,跳过
MOV MINABS, AX ;保存新的最小绝对值
MOV AX, [SI] ;取出新的绝对值最小的数
MOV MIN, AX ;保留新的绝对值最小的数
SKIP2: ADD SI, 2
LOOP AGAIN
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
说明:一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组。
4.21编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组。
答: DATA SEGEMNT
ARRAY DW 30 DUP(?) ;汇编之前置入数据
P DW 30 DUP(?)
M DW 30 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
LEA BX, ARRAY ;ARRAY数组指针
MOV SI, 0 ;P数组指针
MOV DI, 0 ;M数组指针
MOV CX, 30
ONE: MOV AX, [BX] ;从ARRAY数组取出一个数据
AND AX, AL
JGE PLUS ;正数、零转PLUS
MINUS: MOV M[DI], AX ;负数存入M数组
ADD DI, 2
JMP NEXT
PLUS: MOV P[SI], AX ;正数、零存入P数组
ADD SI, 2
NEXT: ADD BX, 2
LOOP ONE
MOV AX, 4C00H
INT 21H CODE ENDS
END START
4.22 缓冲区BUFFER中存放有字符串,以0为结束标志。编写程序,把字符串中的大写字母转换成小写字母。
答: DATA SEGEMNT
BUFFER DB ‘A String for Test.’, 0
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
LEA BX, BUFFER ;BUFFER缓冲区指针
ONE: MOV AL, [BX] ;从缓冲区取出一个字符
AND AL, AL
JZ QUIT ;为零,处理完成
CMP AL, ‘A’
JB NEXT
CMP AL, ‘Z’
JA NEXT
ADD AL, ‘a’-‘A’
MOV [BX], AL
NEXT: INC BX
JMP ONE
QUIT: MOV AX, 4C00H
INT 21H
CODE ENDS
END START
4.23
4.24 编写程序,从键盘上输入一个字符串,统计其中数字字符,小写字母,大写字母,空格的个数并显示。
答:
INCLUDE YLIB.H
CODE SEGMENT
ASSUME CS: CODE
MESS1 DB 0DH, 0AH, ‘Input a string please : $’
BUFFER DB 81, ?, 81 DUP(?)
MESS2 DB 0DH, 0AH, ‘Digits: $’
MESS3 DB 0DH, 0AH, ‘Uppercase alphabet: $’
MESS4 DB 0DH, 0AH, ‘Lowercase alphabet: $’
MESS5 DB 0DH, 0AH, ‘Space : $’
START:
PUSH CS