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码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)