汇编输入一个10进制转化为16进制并存储在段寄存器ds中

;输入一个10进制  input decimal,value [0-65535] 2的16次方就是 dw 一个字
;


data segment
inputV dw 0
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax


mov bx,10   ;作为乘10
xor cx,cx      ;将cx清空



nextValue:

mov ah,1
int 21h       ;读取输入的第一个数以ASCII码读取


cmp al,0dh ;检测是否读到回车 读到回车就结束
je inputEnd ;如果等于 judge equal 就跳转到结束输入



push ax
mov ax,cx ;将存储的cx的值给ax
mul bx      ;乘法ax = ax*bx
mov cx,ax ;将结果存放在cx中
pop ax

sub al,30h ;al中存放16进制数
xor ah,ah  ;将ah清零
add cx,ax  ;将之前没加的值加上
jmp nextValue
inputEnd:


mov inputV,cx ;将结果存放在inputV也就是ds段当中

mov al,cl
mov dl,al
mov ah,2
int 21h


mov ax,4c00h
int 21h         ;exit(0) ;结束
code ends
end start

原理

一位一位的处理

;1234
;31 32 33 34

;1*10 + 2)*10+2

下图是测试转换100 结果为 64


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个将16进制转换为10进制并输出的8086汇编代码,可以在MASM 2015环境下运行: ``` .model small .stack 100h .data hex db '2A', 0 ;要转换的16进制 dec dw ? ;存储转换后的10进制 .code main proc mov ax, @data mov ds, ax ;初始化段寄存器 mov si, offset hex ;将要转换的16进制的地址存储在 SI mov cx, 2 ;设定循环次为2次(16进制的位为2) xor bx, bx ;将 BX 寄存器清零,用于存储转换后的10进制 convert: mov al, [si] ;将16进制的低位存储在 AL cmp al, 'A' ;判断是否大于等于'A' jb convert_end ;如果小于'A',跳转到结束 sub al, 7 ;将'A'~'F'转换成10~15 convert_end: sub al, '0' ;将 ASCII 码值转换成值 mov ah, 0 ;将 AH 寄存器清零 mov cl, 2 ;将 CL 寄存器设定为2 shl bx, cl ;将 BX 寄存器左移2位 add bx, ax ;将转换后的10进制加到 BX 寄存器 inc si ;指向下一个16进制的地址 loop convert ;循环转换 mov dec, bx ;将转换后的10进制存储在 dec mov ah, 9h ;设置输出字符串功能号 mov dx, offset dec ;将要输出的字符串地址存储在 DX int 21h ;输出转换后的10进制 mov ah, 4ch ;设置程序结束功能号 int 21h ;结束程序 main endp end main ``` 以上代码使用循环指令和移位指令将16进制转换为10进制,并使用 INT 21H 断输出结果。需要注意的是,在转换过程需要判断字符是否大于等于'A',如果是则需要将其转换成对应的10~15。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值