例4.8:将A中的二进制数(0-F)转化为相应的ASCII码

例4.8:将A中的二进制数(0-F)转化为相应的ASCII码,第1张

ADC A,#40H 应该是ADDC A,#40H吧

你现在最好拿一个ASCII表看看,对应的数字0到9应该加30H,而字母A到F应该加41H。这是在原来的A中的内容来看的,你可以在这个基础上看。

后面两条指令的解释:ADDC A,#40H 如果是在0到9之间,C为0,则是加了40H,前面加了90H,经过下面的DA A后,就会出来以个A0H,这样就相当加了30H

但在A到F之间的时候也是这样的。

举个例子,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码。

可以使用Union联合体,int类型一般占4个字节,char类型一般占1个字节。因此可以这样写。

#include <stdioh>

union ci{

char c[4];

int i;

}uci;

int main()

{

ucii = 0x3f417961;

printf("int值:%x\n", ucii);

printf("ascii码:%c\t%c\t%c\t%c\n", ucic[0], ucic[1], ucic[2], ucic[3]);

return 0;

}

比如说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:

add al,30h

mov dl,al

mov ah,02h

int 21h

汇编大多是指汇编语言,汇编程序。把汇编语言翻译成机器语言的过程称为汇编。在汇编语言中,用助记符(Memoni)代替 *** 作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理的系统软件。

标准库里有现成的:

#include <stdioh>

char buf[12]; //32位整型转换为最长10字符,连上符号最长为11

sprintf(buf,"%d",1234567890);

windows下似乎有个itoa在<stdlibh>中,我没有查证过:

itoa(1234567890,buf,10);//10代表十进制

HASC:MOV A,R0 ;从R0中取一个16进制(二进制)数(0-F)

ANL A,#0FH ;屏蔽掉高4位

PUSH ACC ;4位二进制数入栈

CLR C ;清进(借)位位

SUBB A,#0AH

POP ACC

JC LOOP

ADD A,#07H

LOOP:ADD A,#30H

MOV R2,A

RET

实验结果:R0中的十六进制数(比如A),转换为ASCII码(41H)送入R2中。

直接将字符变量赋值给整型变量,即可实现字符到对应ASCII码的转换。

具体实现方法可以参考如下程序段:

char str[]="abds%&34dfs"; // 定义一个字符数组,存放待转换为ASCII码的字符串

int AsciiNum[20]; // 定义一个整型数组,存放字符所对应的ASCII码值,数组大小根据字符串长度进行设置

int i;

// 将字符串的每个字符逐个赋值给整型数组AsciiNum,即实现字符到ASCII码值的转换

for(i=0; i<strlen(str); i++)

{

AsciiNum[i] = str[i]; // 最后数组AsciiNum就是字符串每个字符所对应ASCII码值的数组

}

以上就是关于例4.8:将A中的二进制数(0-F)转化为相应的ASCII码全部的内容,包括:例4.8:将A中的二进制数(0-F)转化为相应的ASCII码、汇编程序 十六进制数转换成ASCII码、c语言怎样实现将一个数值(int型)转换为各位对应的ASCII码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10113903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存