微机原理第三章习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理第三章习题答案
习题3答案
1. 指出下列指令的错误原因。
(1) AND AX, DL ;类型不匹配
(2) ADD CS, DX ;CS不能作为目的操作数
(3) MOV AX, IP ;IP不能作为指令的操作数
(4) MOV [BP][SI], [SI] ;两个操作数不能同时为内存操作数
(5) SUB [BP][SI], ES:DX ;段超越前缀只能用在内存操作数之前
(6) XCHG AL, [SI][DI] ;没有[SI][DI]这种操作数形式
(7) JGE AX ;条件转移指令的操作数只能是标号
(8) PUSH DL ;对堆栈不能进行字节操作
2. 用一条指令将BX清0。
(请给出3种方法)
方法1:MOV BX, 0
方法2:SUB BX, BX
方法3:AND BX, 0 ;将BX和0做与,可以将BX清零
方法4:XOR BX, BX
3. 写出实现下列功能的指令序列。
(1) 判断AX的值,若AX等于0,则转到标号LABEL处。
(请写出3种方法)
方法1:
CMP AX, 0
JZ LABEL ; 如果ZF = 0,说明AX为0,因为CMP指令是做减法,但是不写回结果; 因此指令执行后AX内容不会受到破坏方法2:
TEST AX, 0FFH
JZ LABEL ; 如果ZF = 0,说明AX为0,TEST指令做与运算,可是不写回结果,只影响标志位。
; 和0与清零,和1与不变,所以和FFH做与的结果是AX本身,但是此时标志位已
; 经改变了,所以可以利用标志位来判断,但是AX内容却没有受到任何破坏
方法3:
AND AX, 0FFH ;这个方法的原理和方法2其实是完全一致的
JZ LABEL
(2) 将AL的高4位与低4位分别放入AH与AL的低4位,并将AH与AL的高4位清0。
MOV AH, AL
AND AL, 0FH ; AL高4位通过与清零,而低4位保持不变
MOV CL, 4
SHR AH, CL ; 这两条指令通过逻辑右移将AH的高4位清零,因为SHR在右移后,高位补零(3) 若AX和BX中的数恰好1个是奇数、1个是偶数,则将奇数放入AX,偶数放入BX;否则,AX和BX不变。
TEST AX, 01H ;TEST做与运算,通过与来检测AX的最低位
JNZ CONTINUE ;如果ZF = 1,说明AX的最低位是0,那么AX 中的数是偶数,就跳转,否则,;说明AX中的是奇数,而BX中的是偶数,符合结果要求,不用动了
XCHG AX, BX
CONTINUE : ….
4. 分析下列指令序列完成什么功能。
MOV CL, 4
SHL DX, CL
MOV BL, AH
SHL AX, CL
SHR BL, CL
OR DL, BL
答案:将DX.AX中的32位数整体逻辑左移4位。
5. 给出下列各条指令执行后AL以及CF、OF、SF、和ZF的值。
指令AL CF OF SF ZF 备注
MOV AL, 100 100/64H
XOR AL, AL 100/64H 0 0 1 0 XOR后CF=OF=0,其余据结果设置MOV AL, -1 -1/0FFH 0 0 1 0 MOV指令不影响标志位INC AL 0 0 0 0 1 INC不影响CF,其余据结果设置
NOT AL 0FFH 0 0 0 1 NOT指令不影响标志位
SHL AL, 1 0FEH 1 0 1 0 SHL据移出的位设CF,据结果设SF,ZF, 一位移动,据移位前后最高位是否变化设
置,有变化OF = 1, 无变化OF = 0 CMP AL, 10 0FEH 0 0 1 0 CMP指令根据结果设置6个标志位SUB AL, 7FH 7FH 0 0 0 0 SUB根据俄结果设置6个标志位
SHL AL, 1 0FEH 0 1 1 0 解释同上
6. 比较AX,BX和CX中无符号数的大小,将最小数放入AX中。
答案:
CMP AX, BX
JC BBB ; 如果AX <= BX,跳转
XCHG AX, BX ; 否则,交换AX和BX的值,将两者中的小值放到AX中去
BBB:
CMP AX, CX
JC CCC ; 如果AX <= CX,跳转
XCHG AX, CX ; 否则,交换AX和CX的值,将两者中的小值放到CX中去
CCC:
INT 20H ;返回DOS
7. 变量定义伪指令与符号定义伪指令的主要作用是什么?
答案:
变量定义伪指令:主要用来为某种类型(比如字节型、字型)的内存单元的地址指定一个可以引用的名字标识。
符号定义伪指令:其实就是定义一个宏替换常量,用定义的符号代表一个文本串或者一个数值,在程序中遇到定义的符号时用相应的文本串或者数值去替换。
8. 设有下列段定义:
DSEG SEGMENT
X DW 1, 3
DSEG ENDS
给出下列两组指令序列分别执行后AX的值。
(1) MOV AX, DSEG
MOV DS, AX
MOV AX, X+1
(2) MOV AX, SEG X
MOV ES, AX
MOV AX, ES: X
INC AX
答案:
(1) (AX) = 2
(2) (AX) = 2
备注:这两小段程序实现的功能是相同的,都是给子类型的变量X的值加1。
第二段程序采用了段超越方式来寻址操作数。
9. 设有如下定义的数据段:
DA TA SEGMENT
ORG 100
V1 DW 2 DUP (20), $ + 10
BUF1 DB ‘100’, 5
DD 0
BUF2 DW 1, 2, 2A9H
LEN EQU BUF2 – BUF1
V A DW BUF1
DA TA ENDS
则V1+1中存放的字节数据为(0 ),V1+4中存放的字数据为(114 / 72H ),V A的内容为(106 / 6AH ),LEN的值为(8 )。
10. 在数据段定义的两个变量S1和S2,要求设计一个完整的程序,
将以S1为首地址的50个字节依次传送到以S2为首地址的内存单元中。
File1.ASM
datasg segment
s1 db 25 dup ('12')
s2 db 50 dup (0)
datasg ends
codesg segment
assume cs : codesg, ds : datasg
start:
mov ax, datasg
mov ds, ax
mov es, ax
mov si, offset s1
mov di, offset s2
mov cx, 50
rep movsb
mov ax, 4c00h
int 21h
codesg ends
end start
11. 从键盘读入一个字符串(长度< 50),统计其字母、数字及其他字符的个数。
File2.asm
datasg segment
buff1 db 50 ;最大能容纳的字符个数
count db (?) ;实际输入的字符个数
buff2 db 50 dup (?) ;实际字符缓冲区
letters db 0 ;输入的字母个数
digits db 0 ;输入的数字个数
others db 0 ;输入的其他字符的个数
datasg ends
codesg segment
assume cs:codesg, ds:codesg
start:
mov ax, datasg
mov ds, ax
mov dx, offset buff1 ;为0AH号系统功能调用准备输入参数DS:DX指向输入缓冲区的首地址mov ah, 0ah
int 21h
xor al, al
mov ch, 0
mov cl, count ;CX中存放循环次数
mov si, offset buff2 ;为lodsb准备源地址,DS:SI指向实际的字符串地址cld
check:
lodsb ;取一个数据到AL
cmp al, 'A'
jc x1
cmp al, 'Z'
jnc x1
inc letters ;将字符串中的大写字母个数统计到letters变量中
jmp next
x1:
cmp al, 'a'
jc x2
cmp al, 'z'
jnc x2
inc letters ;将字符串中的小写字母个数统计到letters变量中
jmp next
x2:
cmp al, '1'
jc x3
cmp al, '9'
jnc x3
inc digits ;将字符串中的数字字符统计到digits变量中
jmp next
x3:
inc others ;统计其他字符个数
next:
loop check
mov ax, 4c00h
int 21h
codesg ends
end start
12. 设计一个程序,求10个无符号数中的最大值。
并将最大值存入变量MAX中。
File3.asm
datasg segment
array db 20, 12, 16, 14, 13, 90, 45, 32, 67, 100 ;字节型数组
max db 0
datasg ends
codesg segment
assume cs:codesg, ds:datasg
start:
mov ax, datasg
mov ds, ax
lea si, array ;数组首地址
mov cx, 10 ;数组元素个数
cld ;让地址值不断增大
lodsb ;将第一个数组元素放到AL中
mov max, al
dec cx
next:
lodsb ;取下一个数组元素到AL中
cmp al, max
jc goon ;(al) <= max 则max中的值不变mov max, al ;否则max = (al)
goon:
loop next
mov ax,4c00h
int 21h
codesg ends
end start。