16位和32位微处理器的指令系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;显示AX ;显示BX ;显示CX ;显示DX ;显示SP ;显示BP ;显示SI
;显示DI
MOV BX, DS ;显示DS
CALL listbx
MOV BX, ES ;显示ES
CALL listbx
MOV BX, SS ;显示SS
CALL listbx
MOV BX, SEG start
CALL listbx
ቤተ መጻሕፍቲ ባይዱ
ADD DL, 30H ;转变为数字的ASCII
CMP DL, 39H ;大于39H, 则应转变
JLE print
;为字母A~F的ASCII
ADD DL, 07H
print: MOV AH, 2H ;显示DL中的字符
INT 21H
DEC CH
;显示结束?
JNZ next
MOV AH, 4CH ;返回DOS
;显示CS
MOV BX, OFFSET start
CALL listbx
;显示IP
PUSHF
POP BX
;显示PSW
CALL listbx
MOV AH, 4CH ;返回DOS
INT 21H
listbx PROC PUSH CX ;保存寄存器 PUSH BX PUSH DX PUSH AX
listbx PRPOUCSHF MOV CH, 4 MOV CL, 4
1010B
‘A’
1111B
‘F’
开始 显示字符个数CH=4 循环移位次数CL=4
BX循环左移4位,将要显示的 值移至低4位,保存在DL中
清DL 的高4位, 只保留要显示位的值
DL ← DL+30H 完成数值0~9的ASCII码转换
DL 超 出 39H ? N Y
DL←DL+07H 完成数值A~F的ASCII码转换
0000 0001B + 30H= 31H
0000 1001B + 30H=39H
0001B ‘1’
1001B
‘9’
2) 对于1010~1111(A~F), 先扩展成一个字节,高4位清0,
加上30H后, 还要再加上07H,才能得到’A’~’F’ 对应的ASCII 码
0000 1010B+30H+07H = 41H 0000 1111B+30H+07H =46H
例1 将BX寄存器中的内容以十六进制形式显示出来。
▲ BX是一个16位寄存器
二进制 十六进制
1010 1001 0011 1110 A93E
屏幕上的显示 ‘A’ ‘9’ ‘3’ ‘E’ 对应的ASCII 41H 39H 33H 45H
?
▲ 用十六进制显示时,每4位用一个字符显示,共4个
其中 0000 →’0’ 30H , 1010 →’A’ 41H
129E:0000 53
-G
PUSH BX
;执行程序
0000 0000 007B 0000 0000 0000 0000 0000 128E 128E 129E 129E 0000 7202
next: ROL BX, CL MOV DL, BL AND DL, 0FH ADD DL, 30H CMP DL, 39H JLE print ADD DL,07H
print: MOV AH,2H INT 21H DEC CH JNZ next
用十六进制显示 BX内容子程序
MOV DL, 20H ;显示空格符
用02功能显示DL中的字符
N CH ←CH-1转换结束? Y
返回DOS
code SEGMENT
ASSUME CS:code
start: MOV CH, 4 ;字符个数
MOV CL, 4 ;循环移位次数
next: ROL BX, CL ;取显示位的值
MOV DL, BL ;保存在DL中
AND DL, 0FH ;清除高4位
编程将CPU内14个16位寄存器当前的内容 分别用十六进制形式显示出来。
要点: ▲ 将上例改写为一个子程序,入口参数为BX
▲ 子程序中注意寄存器值的保存和恢复
▲ 注意CS 、IP、PSW寄存器值的获取方法
例 将CPU内14个16位寄存器当前内容分别用16进制形式显示出来
(采用DEBUG下R命令的显示顺序)
0001 →’1’ 31H , 1011 →’B’ 42H
、、
、、
1001 →’9’ 39H , 1111 →’F’ 46H
算法:
取出要显示的某4位,转换为对应的ASCII码, 再调用DOS系统功能进行显示。
1) 对于0000~1001(0~9), 先扩展成一个字节,高4位清0, 加上30H后, 即可得字符’0’~’9’对应的ASCII码。
code SEGMENT ASSUME CS:code
start: PUSH BX MOV BX, AX CALL listbx POP BX CALL listbx MOV BX, CX CALL listbx MOV BX, DX CALL listbx MOV BX, SP CALL listbx MOV BX, BP CALL listbx MOV BX, SI CALL listbx MOV BX, DI CALL listbx
MOV AH, 02H
INT 21H
RPEOTPF
;;子恢程复返寄回存器
listbx EPNODPP AX
code PEONPDS DX
PEONPD sBtaXrt
POP CX
RET
;子程序返回
listbx ENDP
code ENDS
END start
D:\>LIST_REG
;在DOS下执行程序
0000 0000 00FF 0BDF 0000 0912 0000 0000 0BDF 0BDF 0BEF 0BEF 0000 3202
D:\ >DEBUG LIST_REG.EXE ;利用DEBUG检测结果
-R
;显示当前寄存器内容
AX=0000 BX=0000 CX=007B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=128E ES=128E SS=129E CS=129E IP=0000 NV UP EI PL NZ NA PO NC
INT 21H
code ENDS
END start
思考:
1. 例1采用的是大写字母A~F进行显示, 若采用小写字符a ~ f 进行显示,程序如何改写? 1010 0011 1001 1110 ‘A39E’ 或 ‘a39e’
2. 编程将 CPU 内 14个 16位寄存器当前的内容 分别用十六进制形式显示出来。