十进制转二进制汇编代码(10进制转2进制编程)

http://www.itjxue.com  2023-03-03 13:53  来源:未知  点击次数: 

用汇编语言将带符号十进制数据的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

(责任编辑:IT教学网)

更多

相关黑客技术文章