汇编语言 十六进制转换为ASCII码 如何用汇编语言把十六进制数1A5F转换成ascii码并显示在...

\u6c47\u7f16\u8bed\u8a00\u5341\u516d\u8fdb\u5236\u8f6c\u6362\u6210ASCII

CODES SEGMENT ASSUME CS:CODES START: PUSH CS POP DS ;\u6b64\u5904\u8f93\u5165\u4ee3\u7801\u6bb5\u4ee3\u7801 MOV BX, 8421H ;\u7ed9\u5b9a\u4e00\u4e2a4\u4f4d\u768416\u8fdb\u5236\u6570 MOV AH, 2 ;\u5411\u6807\u51c6\u8f93\u51fa\u8bbe\u5907\u8f93\u51fa\u4e00\u4e2a\u5b57\u7b26 MOV CX, 16 ;\u5faa\u73af16\u6b21 AGAIN: MOV DL, '0' ; \u5047\u5b9a\u5f53\u524dbx\u7684\u6700\u9ad8\u4f4d\u4e3a0 ADD BX, BX ; bx=bx*2 \u4e5f\u5c31\u662f\u5de6\u79fb1\u4f4d JNC DISP ; \u8fdb\u4f4d\u6807\u5fd7\u4e0d\u7f6e\u4f4d\u65f6\uff08\u5373bx\u7684\u6700\u9ad8\u4f4d\u4e3a0\u65f6\uff09\u8f6cdisp INC DL ; \u8fdb\u4f4d\u6807\u5fd7\u7f6e\u4f4d\u65f6\uff08\u5373bx\u7684\u6700\u9ad8\u4f4d\u4e3a1\u65f6\uff09\u52a01 ; \u4e5f\u5c31\u662f\u53d8\u4e3a '1' DISP: INT 21H LOOP AGAIN MOV AH, 4CH ;\u7a0b\u5e8f\u7ed3\u675f INT 21H CODES ENDS END START

\u521a\u597d\u6211\u5199\u4e86\u4e00\u4e2a\uff0c\u8c03\u8bd5\u90fd\u901a\u8fc7\u53ef\u4ee5\u6267\u884c\u7684\uff0c\u5e0c\u671b\u80fd\u5e2e\u5230\u4f60\u3002
.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;\u5b9a\u4e49\u5b50\u51fd\u6570\uff0cpara1\u53d8\u91cf\u7528\u6765\u653e\u4f20\u5165\u7684\u6570\u7ec4\uff0cpara2\u7528\u4e8e\u653e\u7f16\u7a0bASIC\u540e\u7684\u5b57\u7b26\u6570\u7ec4

LOCAL _iNum;\u5b9a\u4e49\u96f6\u65f6\u53d8\u91cf\uff0c\u7528\u4e8e\u653e\u88ab\u9664\u6570
LOCAL _iTemp;\u5b9a\u4e49\u96f6\u65f6\u53d8\u91cf\uff0c\u7528\u4e8e\u5b58\u653e\u9664\u6570
LOCAL _szTemp[265]:BYTE
mov eax,para1;;\u83b7\u53d6\u53c2\u6570para1\u7684\u503ceax\u5bc4\u5b58\u5668
mov _iNum,eax;\u5c06eax\u4e2d\u7684\u503c\u653e\u5165\u96f6\u65f6\u53d8\u91cf_iNum
mov _iTemp,10H
lea ebx,_szTemp
xor ecx,ecx
.while _iNum;\u5f53\u88ab\u9664\u6570\u4e0d\u4e3a0\u65f6\uff0c\u5c31\u4e00\u76f4\u5faa\u73af
xor edx,edx
mov eax,_iNum;\u5c06\u88ab\u9664\u6570\u653e\u5165eax\u5bc4\u5b58\u5668\u4e2d
div _iTemp;\u5bc4\u5b58\u5668eax\u4e2d\u7684\u503c\u9664\u4ee5_iTemp\uff0c\u5546\u653e\u5165eax\u4e2d\uff0c\u4f59\u6570\u653e\u5165dl\u4e2d
mov _iNum,eax
.if dl>9H;\u5f53\u4f59\u6570\u5927\u4e8e9\u65f6\uff0c\u5c31\u8f6c\u5316\u4e3a\u76f8\u5bf9\u5e94\u7684\u82f1\u6587\u5b57\u6bcd\u7684ASIC\u7684\u503c
add dl,37H
.else
add dl,30H
.endif
mov byte ptr [ebx],dl;\u628a\u53d8\u5316\u540e\u7684\u503c\u653e\u5165ebx\u5bc4\u5b58\u5668\u4e2d
inc ebx
inc ecx
.endw
mov eax,para2;\u5c06\u53c2\u6570para2\u7684\u5730\u5740\u4f20\u7ed9eax\u5bc4\u5b58\u5668\uff0c\u518d\u8bb2ecx\u4e2d\u7684\u503c\u5012\u5e8f\u5b58\u5165eax\u5bc4\u5b58\u5668\u4e2d
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 ;\u4e00\u76f4\u5faa\u73af\uff0c\u76f4\u5230cx\u7684\u503c=0\uff0c\u6bcf\u6b21\u5faa\u73af\u540eecx\u7684\u503c-1

ret

_Translate endp
start:
mov eax,1A5FH ;\u4fee\u6539\u8fd9\u91cc\u7684\u6570\uff0c\u5c31\u80fd\u628a\u4efb\u610f16\u8fdb\u5236\u7684\u6570\u8f6c\u5316\u4e3aASIC\u7801\u4e86
invoke _Translate,eax,offset szResult
invoke MessageBox,NULL,offset szResult,offset szCaption,MB_OK
invoke ExitProcess,0
end start

BUF 子单元的的 每个字节的 16 进制数 加上 30h

;将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



请关注最后的注意点
子程序如下:
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
AND AL,0FH
CMP AL,0AH
JB SAL
ADD AL,07H
SAL: ADD AL,30H
OR AL,AH
MOV [DI],AL
INC SI
INC DI
DEC DX
JNZ TRANS
POPA
RET
;------------------------END-----------------------

注意点一:
BUF为“字”,即十六位二进制数,分为四个十六进制数,则各数据各为四位二进制数。保证不超过0FH了。那么也就是十六进制数字的转换。

注意点二:
0~9这十个数的ASCII码与数字本身相差为30H,而A~F则是相差了37H,中间的7个是‘,’‘.’‘+’之类的符号。

主程序只需将BUF与MAS的地址关联,然后调用CALL TRANSLATE就可以了。

扩展阅读:十六进制在线转换器 ... 进制转换器在线计算器 ... 十六进制转换计算器 ... 十六进制对照表 ... 十六进制计算在线 ... 中文十六进制翻译器 ... 十六进制在线转换查询 ... 汇编语言教学视频教程 ... 文言文翻译转换器 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网