汇编语言:十进制转十六进制(子程序设计)

目的

编写十进制到十六进制转换程序。要求从键盘取得一个十进制数,然后把该数以十六进制形式在屏幕上显示出来

设计思路

设计子函数readchar用于读入操作,利用循环语句input进行循环读入,对读入的每一个字符进行判断,若读入字符在’0’-'9’之外,则结束输入,且每一次输入后将前一次输入的总和×10。设计子函数convert用于将bx中保存的10进制数字转化为16进制并输出。

程序代码

assume cs:code,ds:data

data segment
   str1 db 0AH,'Input decimal number: ','$' 	 
   str2 db 0AH,'hexadecimal number: ','$' 
data ends

code segment
start:
    mov ax,data
    mov ds,ax
main:
    call readchar
    call convert
    mov ah,4ch
    int 21h
readchar proc near:    ;读入函数
    lea dx,str1
    mov ah,09
    int 21h
    mov bx,0
  input:                   
    mov ah,01h
    int 21h
    cmp al,'9'        ;输入数字之外的字符,就结束输入
    ja exit
    cmp al,'0'
    jb exit
    sub al,'0'        ;把字符转换为数字
    mov ah,0h    ;避免ah数值的影响
    mov dx,ax
    mov ax,bx
    mov bx,dx
    mov cx,0ah
    mul cx           ; 把之前输入的数乘以10,加上本次输入,保存到bx
    mov dx,ax
    mov ax,bx
    mov bx,dx
    add bx,ax
    jmp input

    exit:
    ret
readchar endp

convert proc near:    ;转换函数
    lea dx,str1
    mov ah,09
    mov ch,04h
  loopc:
    mov cl,04h
    rol bx,cl
    mov al,bl
    and al,0fh
    add al,30h
    cmp al,'9'       
    jbe printf        ;字符为'9'之下,直接显示。
    add al,07h        ;大于9的数字转换为'A'-'F'

  printf:
    mov dl,al
    mov ah,2
    int 21h
    dec ch
    jne loopc         ; 单独用ch进行循环操作
    ret
convert endp

code ends
    end start

运行结果:

在这里插入图片描述

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是汇编代码实现: ``` ; 程序:两个多字节二进制数相乘 ; 输入:AX = 第一个数的低位,BX = 第二个数的低位 ; 输出:DX:AX = 乘积 MULT: XOR DX, DX ; 清除 DX 寄存器 MOV CX, 16 ; 循环 16 次 MULT_LOOP: TEST AX, 1 ; 检查第一个数的最低位是否为 1 JZ MULT_NEXT ; 如果是 0,跳过下面的指令 ADD DX, BX ; 将第二个数加到 DX 中 MULT_NEXT: SHR AX, 1 ; 将第一个数右移一位 SHL BX, 1 ; 将第二个数左移一位 LOOP MULT_LOOP ; 循环 RET ; 返回 ; 主程序 ORG 100h ; 输入两个多字节二进制数 MOV AX, 1001b ; 第一个数为 1001b,即 9 MOV BX, 1010b ; 第二个数为 1010b,即 10 ; 调用程序进行相乘 CALL MULT ; 输出乘积 MOV SI, OFFSET RESULT MOV AX, DX CALL HEX_OUTPUT MOV AX, AX MOV AX, AX CALL HEX_OUTPUT ; 停机 INT 20h ; 程序:以十六进制的形式输出 AX 的值 HEX_OUTPUT: PUSH AX ; 保存 AX 的值 MOV BX, 10 ; 将 BX 设置为 10,用于除法运算 MOV CX, 4 ; 将 CX 设置为 4,用于循环 4 次 HEX_LOOP: XOR DX, DX ; 清除 DX 寄存器 DIV BX ; 用 BX 除 AX,得到余数和商 ADD DL, '0' ; 将余数换为 ASCII 码 CMP DL, '9' ; 如果余数大于 9 JBE HEX_NEXT ; 跳到 HEX_NEXT ADD DL, 7 ; 将余数加上 7,换为大写字母 HEX_NEXT: MOV [SI], DL ; 将换后的字符存入结果数组 INC SI ; 将指针移动到下一个位置 LOOP HEX_LOOP ; 循环 POP AX ; 恢复 AX 的值 RET ; 返回 ; 数据段 RESULT DB 6 DUP ('0'), '$' ; 存放结果的数组 END ``` 运行结果为:`009A`,即乘积为十进制的 90,换成十六进制后为 9A。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值