今天写了个汇编语言十六进制输出的作业,感觉有点难度,写了两个小时,现在在下面做个总结。
总觉得汇编语言的输出很麻烦,但是目前刚刚开始学,还不清楚怎么化繁为简,输出数字的时候只能根据数字字符的ASCII码输出,不像之前学的其他语言直接控制格式输出就行。
举个例子,对于3B4EH这个十六进制数,要怎么在汇编窗口输出呢?
先考虑高八位 ,要先输出第一个数,就要使高八位逻辑右移四位,变成03,再与30H做或运算,变成33H,比较是否是对应字符的ASCII码,即是否小于39,小于则可以直接输出,因为此时对应的就是改数字的ASCII码;还原数字3B,3已经输出过了,现在考虑高八位中的低四位要怎么输出。用高八位与0FH做与运算,得到0BH,再与30H做或运算变成3BH,比较是否小于39H,小于则直接输出,但此时是大于39H,即应该输出的是B,B的ASCII码是42,要使3B变成42需要加上7,所以每次到跟39H比较时,小于39H则直接跳过加7这一步,大于才需要加7。
低八位的考虑跟高八位一样,这里·就不重复叙述了。
总的来说就是八位八位地考虑,八位中获取高四位的方法是右移四位,获取低四位的方法是与0FH做与运算。
DATA SEGMENT
BUF DW 1278,52,114,2317,8654,357,64
N DW ($-BUF)/2
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX ;设置DS
LEA SI,BUF
MOV CX,N ;初始化循环次数CX
BE: MOV N,CX ;把剩余未处理数的个数赋值给N
MOV DX,BUF[SI] ;取现在要处理的数
ADD SI,02H ;指针加二,指向下一个未处理的数
CALL SIXTEEN ;调用子程序输出十六进制
MOV CX,N ;若剩余未处理数为一个
CMP CX,1
JE DONE ;则不用输出','
MOV DL,',' ;否则输出','
MOV AH,2
INT 21H
LOOP BE ;根据未处理数的个数决定要不要循环
DONE: MOV AX,4C00H
INT 21H
;字程序按十六进制输出
SIXTEEN PROC NEAR
MOV BX,DX ;先把要处理的数拷贝一份到BL
MOV CL,4 ;4代表等会儿逻辑右移的位数
SHR DH,CL ;将数逻辑右移四位取字节的高四位
OR DH,30H ;与30H做或运算
CMP DH,39H ;比较高四位是否小于9
JBE ONE ;小于9则跳转,不需要转化为字母的ASCII码
ADD DH,7 ;运行到此处说明高四位为A-Z,加7转化为对应的ASCII码
ONE: MOV DL,DH ;按ASCII码输出字符
MOV AH,02H
INT 21H
MOV DH,BH ;还原未处理数
AND DH,0FH ;将数与0FH做与运算,意求字节的低四位
OR DH,30H ;与30H做或运算
CMP DH,39H ;比较低四位是否小于9
JBE TWO ;小于9则跳转,不需要转化为字母的ASCII码
ADD DH,7 ;运行到此处说明低四位为A-Z,加7转化为对应的ASCII码
TWO: MOV DL,DH ;按ASCII码输出字符
MOV AH,02H
INT 21H
MOV DL,BL
SHR DL,CL ;将数逻辑右移四位取字节的高四位
OR DL,30H ;与30H做或运算
CMP DL,39H ;比较高四位是否小于9
JBE THREE ;小于9则跳转,不需要转化为字母的ASCII码
ADD DL,7 ;运行到此处说明高四位为A-Z,加7转化为对应的ASCII码
THREE: MOV AH,2 ;按ASCII码输出字符
INT 21H
MOV DL,BL ;还原未处理数
AND DL,0FH ;将数与0FH做与运算,意求字节的低四位
OR DL,30H ;与30H做或运算
CMP DL,39H ;比较低四位是否小于9
JBE FOUR ;小于9则跳转,不需要转化为字母的ASCII码
ADD DL,7 ;运行到此处说明低四位为A-Z,加7转化为对应的ASCII码
FOUR: MOV AH,2 ;按ASCII码输出字符
INT 21H
MOV DL,'H' ;输出'H'
MOV AH,2
INT 21H
RET ;子程序返回
SIXTEEN ENDP
CODE ENDS
END START
学如逆水行舟,不进则退;
心似平原跑马,易放难收。
希望每天多努力一点!
小伙伴们看了这个有什么不明白或者发现我写的代码有错可以在下面评论哦,我看到会尽快回复的~大家一起进步