十进制转二进制汇编代码(10进制转2进制编程)
用汇编语言将带符号十进制数据的ASCII码串转换为二进制补码表示怎么做?
将带符号十进制数据的ASCII码串转换为二进制补码表示
主要是不懂带符号十进制数据的ASCII码串在内存中是如何存储的。
--------------
带符号十进制数据的ASCII码串,
这是指:以 0 做结尾标志的一串 ASCII 码。
随便写出两串,如下:
DB? '+12345', 0
DB? '-24680', 0
把它们,转换为二进制补码表示,即为:
0011 0000 0011 1001;
1001 1111 1001 1000。
汇编语言程序如下:
其中“带符号十进制数据的ASCII码串”是:-13579。
程序显示出的,正是其补码:1100 1010 1111 0101。
用汇编语言实现十进制转化为二进制,要使用递归算法
;用的递归,全部复制到记事本中查看,效果更佳.呵呵
assume cs:code
stack segment stack
dw 512 dup(?) ;栈空间
stack ends
data segment
dw 6 ;如果要试其它数可以改这个.
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov ax,[bx] ;取被除数6,作为参数
xor dx,dx ;被除数高位清空
mov cx,2 ;除数参数
call dtob ;开始
jmp ed ;跳向程序结束
;子程序开始
dtob: div cx ;执行后DX为余数,AX为商
push dx ;余数先保存
xor dx,dx ;清除,为了下一次作为被除数准备.
cmp ax,0 ;检查商是否为0
je s ;等于跳
call dtob ;不等于就进去这个再算
s: pop dx ;取回余数,此时dx不是0就是1.
add dx,30h ;变成字符
mov ah,2 ;21H中断功能号2
int 21h ;输出余数
ret ;返回
;子程序结束
ed: mov ah,4ch ;程序结束
int 21h
code ends
end start
谁给我解释一下以下代码(汇编十进制转二进制).
DATAS SEGMENT
INF1 DB "PLEASE INPUT A NUMBER(0-65536)$:" ;提示信息
IBUF DB 7,0,6 DUP(77H);键盘接收缓冲区
DATAS ENDS
START:
MOV DX,OFFSET INF1 ;3条指令的功能为在屏幕上显示提出信息字符串
MOV AH,09H
INT 21H
MOV DX,OFFSET IBUF ;3条指令的功能为从键盘接收字符串
MOV AH,0AH
INT 21H
MOV CL,IBUF+1;2条指令的功能为将实际接收的字符数存入CX
MOV CH,0
MOV SI,OFFSET IBUF+2 ;将存储实际接收字符的首地址送SI
MOV AX,0 ;
AGAIN:
MOV DX,10 ;2条指令的功能为(AX)=(AX)*10
MUL DX ;
AND BYTE PTR[SI],0FH ;将相应存储单元中的字符ASCII转换为数字
ADD AL,[SI];2条指令的功能为(AX)=(AX)+数字
ADC AH,0;
INC SI ;调整SI指向下一个单元
LOOP AGAIN;循环执行,完成(AX)=(AX)*10+[SI]
举例说明:如果从键盘接收123,则IBUF中依次存放7,3,31H,32H,33H
首先(AX)=0,(CX)=3,取出第一个字符ASCII31H,转换成相应数字1,利用(AX)=(AX)*10+1=0*10+1=1;然后取出第二个字符ASCII32H,转换成相应数字2,利用(AX)=(AX)*10+2=1*10+2=12;最后取出第三个字符ASCII33H,转换成相应数字3,利用(AX)=(AX)*10+3=12*10+3=123。
注意:在计算机中十进制数123是以二进制数存储的,所以此程序是将屏幕输入的字符123利用(AX)=(AX)*10+[SI]转换为二进制数。
将某个十进制数ASCII码串转换为对应的二进制数汇编语言
dseg?segment
??d0?db?'12345'??;数字字符串
??c??equ?$-d0????;长度
??a??dw?0?;转换后的结果
dseg?ends
assume?cs:cseg,?ds:dseg
cseg?segment
start:
??mov?ax,?dseg
??mov?ds,?ax
??mov?bx,?10?;10进制
??mov?ah,?0?;
??lea?si,?d0
??mov?cx,?c
m0:
??mov?al,[si]
??and?al,0Fh??;ASCII数转为对应的数,相当于sub?al,30H
xchg?ax,?a?;ax,?a交换
??mul?bx?????;a*10?-?dx:ax,?只取ax
??add?ax,?a??;a*10?+?a
??xchg?ax,?a?;交换回去
??inc?si?????;下一个数
??loop?m0
??;转换结束,10进制打印
??mov?ax,?a
??xor?cx,?cx
Q0:
??xor?dx,?dx
??div?bx
??xor?dx,?0e30h
??push?dx
??inc?cx
??cmp?ax,?0
??jnz?Q0
Q1:
??pop?ax
??int?10h
??loop?Q1
??mov?ax,4c00h
??int?21h
cseg?ends
end?start
用汇编语言写:从键盘输入一个十进制数(四位数),将其转变为二进制数并在屏幕输出
?;输入不超过65535的10进制数,将其以16位2进制数的形式显示
code??segment
??????assume?cs:code
??????org?100h
start:
??????jmp?bbb
x?????dw?0
msg1??db?10,13,'please?input?a?number:','$'
msg2??db?10,13,16?dup(0),'$'
bbb:??push?cs
??????pop?ds
??????push?cs
??????pop?es
??????lea?dx,msg1
??????mov?ah,9
??????int?21h
??????lea?bx,x
??????mov?ax,0
??????push?ax
again1:
??????mov?ah,1
??????int?21h
??????cmp?al,13
??????je?line0
??????sub?al,30h
??????mov?ah,0
??????mov?si,ax
??????pop?ax
??????mov?cl,10
??????mov?ch,0
??????mul?cx
??????add?ax,si
??????push?ax
??????jmp?again1
line0:
??????pop?ax
??????mov?word?ptr[x],ax
??????;=================
??????lea?di,msg2
??????inc?di
??????inc?di
??????mov?cx,16
??????mov?ax,word?ptr[x]
again2:
??????rol?ax,1
??????jc?@1
??????mov?byte?ptr[di],30h
??????jmp?@2
@1:???mov?byte?ptr[di],31h
@2:???inc?di
??????loop?again2
??????;==============
??????lea?dx,msg2
??????mov?ah,9
??????int?21h
??????mov?ah,8
??????int?21h
??????mov?ah,4ch
??????int?21h
code??ends
??????end?start