汇编程序 十六进制数转换成ASCII码

作者&投稿:务宗 (若有异议请与网页底部的电邮联系)
如何用汇编语言把十六进制数1A5F转换成ascii码并显示在屏幕上~

刚好我写了一个,调试都通过可以执行的,希望能帮到你。
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
szCaption db 'convert num to srting',0
szResult db 6 dup(0)
.code
_Translate proc para1:DWORD,para2:DWORD;定义子函数,para1变量用来放传入的数组,para2用于放编程ASIC后的字符数组

LOCAL _iNum;定义零时变量,用于放被除数
LOCAL _iTemp;定义零时变量,用于存放除数
LOCAL _szTemp[265]:BYTE
mov eax,para1;;获取参数para1的值eax寄存器
mov _iNum,eax;将eax中的值放入零时变量_iNum
mov _iTemp,10H
lea ebx,_szTemp
xor ecx,ecx
.while _iNum;当被除数不为0时,就一直循环
xor edx,edx
mov eax,_iNum;将被除数放入eax寄存器中
div _iTemp;寄存器eax中的值除以_iTemp,商放入eax中,余数放入dl中
mov _iNum,eax
.if dl>9H;当余数大于9时,就转化为相对应的英文字母的ASIC的值
add dl,37H
.else
add dl,30H
.endif
mov byte ptr [ebx],dl;把变化后的值放入ebx寄存器中
inc ebx
inc ecx
.endw
mov eax,para2;将参数para2的地址传给eax寄存器,再讲ecx中的值倒序存入eax寄存器中
mov byte ptr [eax+ecx],0
lea ebx,_szTemp
.repeat
mov dl,byte ptr [ebx]
mov byte ptr [eax+ecx-1],dl
inc ebx
.untilcxz ;一直循环,直到cx的值=0,每次循环后ecx的值-1

ret

_Translate endp
start:
mov eax,1A5FH ;修改这里的数,就能把任意16进制的数转化为ASIC码了
invoke _Translate,eax,offset szResult
invoke MessageBox,NULL,offset szResult,offset szCaption,MB_OK
invoke ExitProcess,0
end start

比如将1A5Fh转为ascii码,程序如下:code segment assume cs:code org 100hstart: jmp bbb nopx dw 1A5Fhbuf db 10,13,0,0,0,0,'$'bbb: lea bx,x lea di,buf inc di inc di mov cx,4line1: mov ax,word ptr[bx] rol ax,4 mov word ptr[bx],ax and ax,000Fh cmp al,9 jg line2 add al,30h jmp line3line2: add al,37hline3: mov byte ptr[di],al inc di loop line1 lea dx,buf mov ah,9 int 21h mov ah,8 int 21h mov ah,4ch int 21hcode ends end start

举个例子,6CH,转换成ASCII码,是以十六进制形式显示:6CH,还是以十进制形式显示:108?

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:把AL中的二进制无符号数转换成显式的十进制ASCII
; 入口:AL=二进制数;di=转换后的ASCII保存地址
; 出口:无
HEXASC_Dec Proc Near
push si
push cx
push bx
push di
mov bl,10
xor cx,cx
lea di,@@Temp_Save[3]
cld
@@Divide: xor ah,ah
div bl
or ah,30h
mov [di],ah
dec di
inc cx
test al,0ffh
jnz @@Divide
push di
pop si
inc si
pop di
pop bx
rep movsb
pop cx
pop si
ret
@@Temp_Save db 4 dup(?)
HEXASC_Dec EndP
; -----------------------------------------
; 功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 ;AL<10?
jb @@To_ASCII ;AL<10,按数字处理
add al,7 ;AL>=10,按大写字母处理
@@To_ASCII: add al,'0' ;转换成相应的数字或大写字母
ret
AL_ASCII EndP
; -----------------------------------------
; 功能:将AL中的字节数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AX=转换后的ASCII码
HEXASC_Hex Proc Near
push cx
mov cx,4
xor ah,ah ;将AH置0
shl ax,cl ;将AX左移4位
shr al,cl ;将AL右移4位
xchg ah,al
call AL_ASCII ;调用子程序,将AL中的值转换成相应的ASCII码
xchg ah,al
call AL_ASCII
xchg ah,al
pop cx
ret
HEXASC_Hex EndP
; -----------------------------------------
Translate db '0' ;转换方式(默认:十进制数显示;若要十六进制显示,则改为:1)
BUF db 23,35,46,57,68,79,81,98,119,243
Elements EQU ($-BUF)/Type BUF ;元素个数
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
lea si,BUF
lea di,Temp_STr
mov cx,Elements
HEX_ASCII: lodsb
.IF Translate == '0'
call HEXASC_Dec
.ELSE
call HEXASC_Hex
stosw
mov al,'H'
stosb
.ENDIF
mov al,','
stosb
loop HEX_ASCII
dec di
mov al,'$'
stosb
Output Temp_STr
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Temp_STr:
Code ENDS
END Start ;编译到此结束
; -----------------------------------------
ADD AL,90H
DAA
ADD AL,40H
DAA

十进制数加调整指令DAA(Decimal Adjust After Addition)

该指令是用于调整AL的值,该值是由指令ADD或ADC运算二个压缩型BCD码所得到的结果。压缩型BCD码是一个字节存放二个BCD码,低四位和高四位都是一个BCD码。

其调整规则如下:

* 如果AL的低四位大于9,或标志位AF=1,那么,AL=AL+6,并置AF=1;
* 如果AL的高四位大于9,或CF=1,那么,AL=AL+60H,并置CF=1;
、如果以上两点都不成立,则,清除标志位AF和CF。

经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相加,并进行调整后,得到的结果还是压缩型BCD码。

ADD AL,90H
DAA
ADC AL,40H
DAA

这段程序,是把十六进制数转换成ASCII码。

显示10个两位十六进制数的完整程序如下。




榆次区18415398071: 汇编语言 十六进制转换为ASCII码 -
斐凌蒲地: 请关注最后的注意点 子程序如下: TRANSLATE:;假设之前已经有LEA SI,BUF;和LEA DI,MAS PUSHA TRANS: MOV DX,2 LODSB MOV AH,AL MOV CL,4 SHR AH,CL CMP AH,0AH JB SAH ADD AH,07H SAH: ADD AH,30H CHL AH,CL ...

榆次区18415398071: 将16进制数转化为ASCII码,用汇编语言,最好用上堆栈
斐凌蒲地: 假设AL为16进制数要变为ASCII码 push al and al,f0H shr al,4 add al,30 mao bh,al pop al and al,0fh add al,30 mov bl,al 这样BX就是AL数字所对应的两位ASCII码

榆次区18415398071: 汇编语言 编写一个程序,将AL寄存器中的一位十六进制数转化成ASCII码 显示输出 -
斐凌蒲地: ;将AL寄存器中的一位十六进制数转化成ASCII码,显示输出. ;推荐答案,写的并非是一位.;程序如下:ASSUME CS:CODE CODE SEGMENT START:MOV AL, 0FH ;在这里可写 00H~0FH,这就是一位16进制数AND AL, 0FH ;无...

榆次区18415398071: 使用汇编把十六进制转换成相应的ASCII值是怎么个思路,用自然语言描述 -
斐凌蒲地: 十六进制转ASCII值 把4位值跟10相比 小于加38 其它的加55 然后输出; 转十进制 假设这个十六进制数在内存中,那么把这个数除以10分别输出就行了.

榆次区18415398071: 用汇编语言编写源程序:用查表方法,将一位十六进制数转换成其ASCII码,并储存. -
斐凌蒲地: 建表太麻烦了,我就把中间用到的关键指令给楼主吧(注:我用的是nasm) mov al,[十六进制值] mov bx,表首地址 xlat 这三步即可使得al中的结果为对应十六进制数的ASCII码了.

榆次区18415398071: 用汇编怎么将16进制转ASCII码 -
斐凌蒲地: 比如说1aH 转换成ASCII就是31h,41h 计算过程就是当<A时,+30h,否则加37h mov mem,1ah mov al,mem and al,0f0h shr al,4 cmp al,a jb xx add al,7h xx: add al,30h mov dl,al mov ah,02h int 21h mov al,mem and al,0fh cmp al,a jb xxx add al,7h xxx: ...

榆次区18415398071: 单片机汇编一个将2位16进制数转换为ASCII子程序 -
斐凌蒲地: URNUM EQU #0F1H;还是分两段吧, 有需要的话把main修改成子程序用RET返回 MAIN:MOV A,URNUM PUSH ACC ACALL HEX2ASC MOV R6,R2 POP ACC SWAP A ACALL HEX3AC MOV R7,R2 SJMP $ ORG #0064H HEX2ASC:ANL A,#0FH ;取低4位 CJNE A,#0AH,CONVT CONVT: ADD A,#30H ;小于10转成数字 JNC ISCHAR ;大于等于10再加1转成字符 SJMP NEXT ISCHAR:INC A NEXT:MOV R2,A ;保存转换结果 RET

榆次区18415398071: 一个十六进制数转换成ASCII码的单片机程序 -
斐凌蒲地: HASC:MOV A,R0 ;从R0中取一个16进制(二进制)数(0-F)ANL A,#0FH ;屏蔽掉高4位PUSH ACC ;4位二进制数入栈CLR C ;清进(借)位位SUBB A,#0AHPOP ACCJC LOOPADD A,#07H LOOP:ADD A,#30HMOV R2,ARET实验结果:R0中的十六进制数(比如A),转换为ASCII码(41H)送入R2中.刚才回答了,没有了吗?

榆次区18415398071: 汇编语言:编两个通用过程完成十六进制数转换成ASCII码并将ASCII码字符显示(哪位高人给点指导,鞠躬~)
斐凌蒲地: CsnCharToData Proc lpszChar:DWORD,lpBuff:DOWRD,sizechar:DWORD pushad mov edi,lpBuff mov esi,lpszChar mov ecx,sizechar _CsnCTD: xor eax,eax mov al,Byte ptr [esi] shl ax,4 shr al,4 _CsnTow: cmp al,9h ja _d9 add al,30h jmp _end _d9: ...

榆次区18415398071: 怎么用单片机编写一段程序将若干十六进制数转换为ASCII码?
斐凌蒲地: 不知你要的是C语言的还是汇编的,都给你吧 C语言的:#include <REG51.H> typedef unsigned char uchar;#define NUMBER 10 uchar BufferIn[NUMBER]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x1a,0x1b};//16进制数存放区 uchar BufferOut[2*...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网