汇编语言 编写一个程序,将AL寄存器中的一位十六进制数转化成ASCII码 显示输出

如题所述

;将AL寄存器中的一位十六进制数转化成ASCII码,显示输出。
;推荐答案,写的并非是一位。

;程序如下:

ASSUME CS:CODE
CODE SEGMENT
START:
MOV AL, 0FH ;在这里可写 00H~0FH,这就是一位16进制数
AND AL, 0FH ;无用位清零,保留该数字
;下面是变成ASCII码
CMP AL, 0AH
JB NEXT
ADD AL, 07H
NEXT:
ADD AL, 30H
;下面是显示输出
MOV DL, AL ;送到DL
MOV AH, 2 ;显示单个字符
INT 21H ;显示
MOV AH, 4CH ;结束程序
INT 21H ;返回DOS
CODE ENDS
END START
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-07
给你一个例子吧~~王爽汇编那本书的课程设计一中的代码

assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的21个字符串

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司收入的21个dword型数据

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends

showdata segment
db 10 dup(0)
showdata ends

datashop segment
db 10 dup(0)
datashop ends

codesg segment
start:
;数据
mov ax,data
mov ds,ax
;栈
mov ax,showdata
mov ss,ax
mov sp,12
;显示
mov ax,0b800h
mov es,ax
;初始化数据
mov cx,21
mov bx,0
mov bp,320

s: ;显示年份
call showyear
call showinfo
call showperson
call shownumber
add bx,4
add bp,160
loop s
mov ax,4c00h
int 21h

showyear:
;准备
push cx
mov cx,4
mov si,0
mov di,0
;开始
yearlp: mov al,[bx+si+0h]
mov es:[bp+di+0h],al
mov byte ptr es:[bp+di+1h],01000000b
inc si
add di,2
loop yearlp

pop cx
ret

showinfo:
;准备
push cx
;用于存储数据
mov ax,datashop
mov es,ax
;取出数字
mov si,0
mov ax,[bx+si+54h]
add si,2
mov dx,[bx+si+54h]
;规划
push ds
push es
pop ds
push bx
mov bx,0b800h
mov es,bx
;SI用来存放位置
mov si,1
;处理dx是两位数
cmp dx,0ah
ja div3
;处理dx是一位数
cmp dx,0
ja div2
;处理dx是0
mov di,10
jmp div1

div3:
mov di,100
div di
;把商压栈
push ax
;转移余数
mov ax,dx
xor dx,dx
;先处理余数
mov di,10
div di
mov [si],dl
inc si
xor dx,dx
div di
mov [si],dl
inc si
;恢复
pop ax
jmp div1

div2:
mov di,10
div di
mov [si],dl
inc si

div1:
mov bx,10
mov di,20h

call startdiv

pop bx
pop ds
pop cx
ret

showperson:
;准备
push cx
;START
;确定位置
mov ax,bx
xor dx,dx
mov di,2
div di
;取出数字
mov si,ax
mov ax,[si+0a8h]
;准备存储
push ds
push bx
mov di,40h
mov si,1
call show
;END
;恢复
pop bx
pop ds
pop cx
ret

shownumber:
;准备
push cx
;取出资金数字
mov si,0
mov ax,[bx+si+54h]
add si,2
mov dx,[bx+si+54h]
;准备
push dx
push ax
;取出人数数字
;确定位置
mov ax,bx
xor dx,dx
mov di,2
div di
;取出数字
mov si,ax
mov di,[si+0a8h]
;恢复被除数
pop ax
pop dx
;开始除法
div di
;储存商
push ds
push bx
mov di,60h
mov si,1
call show

;恢复
pop bx
pop ds
pop cx
ret

show:
mov cx,datashop
mov ds,cx
mov bx,10

startdiv:
xor dx,dx
div bx
mov [si],dl
cmp ax,0
je enddiv
inc si
jmp startdiv

enddiv:
mov cx,si

showwhat:
mov al,[si]
add al,30h
mov es:[bp+di],al
mov es:[bp+di+1h],al
dec si
add di,2
loop showwhat

ret
codesg ends
end start

这个在debug中运行-g可以查看效果
第2个回答  2012-12-07
assume cs:code

code segment
start:
mov al,2Fh ;现在假设al=12H
mov ch,2 ;循环次数
mov bl,al
next: mov cl,4 ;移动的位数
rol bl,cl ;循环左移4位,为什么要用循环左移动呢,因为这样不会改变al的值(循环结束后)
mov al,bl
and al,0Fh ;将高4位清0
or al,30h ;也可以用add al,30h,转换成十六进制
cmp al,3ah ;看是否小于10,因为十六进制大于10,就会有变化
jl done
add al,7h
;打印出来
done: mov dl,al
mov ah,2
int 21h
dec ch
jnz next
mov ax,4c00h
int 21h

code ends
end start

PS:若有不明白的地方,可以追问本回答被网友采纳
相似回答