基数转换子程序

题目要求

基数转换程序
将寄存器EAX中的32位无符号二进制数转换为P进制数(P为 3-16 中任何一个整数)
P进制的ASCII码按照高位在前,低位在后的顺序存放在SI指定的首址的字节存储区域

; 子程序名: radix 
; 功能: 将EAX中的32位无符号二进制数转换为P进制数(16位段)
; 入口参数:
;           EAX 存放待转换的32位无符号二进制数
;           EBX 存放要转换的数值的基数
;           SI 存放转换后的P进制ASCII码数字串的字节缓冲地址
; 出口参数:
; 所求P进制的ASCII码数字串按照高位在前,低位在后的顺序存放在SI为指针的字节缓冲区中
; SI 所指向字节缓冲区中最后一个ASCII码的下一个字节处
; 寄存器:
; CX  P进制数字入栈、出栈的计数器
; EDX 做除法时存放被除数高位或余数

radix proc
    ;保护现场
    push cx 
    push edx 
    ;计数器清零
    xor cx, cx 
lop1:
    xor edx, edx ;edx清零
    div ebx ; EAX / EBX(p) 商在EAX中,余数在DX中
    push dx ;余数入栈 
    inc cx  ;计数器加1 
    or eax, eax 
    jnz lop1  ;如果eax != 0循环 lop1 

lop2:
    pop ax  ;从栈中取出一个余数
    cmp al, 10 ; al < 10 ?
    jb L1      ;是 转 L1
    add al, 7   ;越过数字字符与字母字符之间的间隔
L1: 
    add ax, 30h;将数字转换为数字字符
    inc si 
    loop lop2 
    ;恢复现场
    pop edx 
    pop cx 
    ret 
radix endp

测试程序

.386

stack segment use16 stack
    db 100 dup(0)
stack ends

data segment use16
    D dd 123
    buf db 20 dup(?)
    mesg1 db "radix 16 is: ", 0ah, 0dh, '$'
data ends

code segment use16
    assume cs:code, ds:data, ss:stack
; 子程序名: radix 
; 功能: 将EAX中的32位无符号二进制数转换为P进制数(16位段)
; 入口参数:
;           EAX 存放待转换的32位无符号二进制数
;           EBX 存放要转换的数值的基数
;           SI 存放转换后的P进制ASCII码数字串的字节缓冲地址
; 出口参数:
; 所求P进制的ASCII码数字串按照高位在前,低位在后的顺序存放在SI为指针的字节缓冲区中
; SI 所指向字节缓冲区中最后一个ASCII码的下一个字节处
; 寄存器:
; CX  P进制数字入栈、出栈的计数器
; EDX 做除法时存放被除数高位或余数

radix proc
    ;保护现场
    push cx 
    push edx 
    ;计数器清零
    xor cx, cx 
lop1:
    xor edx, edx ;edx清零
    div ebx ; EAX / EBX(p) 商在EAX中,余数在DX中
    push dx ;余数入栈 
    inc cx  ;计数器加1 
    or eax, eax 
    jnz lop1  ;如果eax != 0循环 lop1 

lop2:
    pop ax  ;从栈中取出一个余数
    cmp al, 10 ; al < 10 ?
    jb L1      ;是 转 L1
    add al, 7   ;越过数字字符与字母字符之间的间隔
L1: 
    add al, 30h;将数字转换为数字字符
    mov [si], al 
    inc si 
    loop lop2 
    ;恢复现场
    pop edx 
    pop cx 
    ret 
radix endp

;=====================主程序=========================
main:
    mov ax, data
    mov ds, ax

    ;将D转换为16进制, 并显示在屏幕上
    mov eax, D
    mov ebx, 16
    lea si, buf 
    call radix 

    mov buf[si], '$'

    lea dx, buf
    mov ah, 9
    int 21h


exit:
    mov ah, 4ch
    int 21h

code ends
    end main

使用C++说明转换逻辑

#include <iostream>
#include <stack>
using namespace std;

int main() {
    char tab[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    int n, m;
    cin >> n >> m;
    stack<int> S;
    while(n) {
        S.push(n % m);
        n /= m;
    }
    while(!S.empty()) {
        cout << tab[S.top()];
        S.pop();
    }
    cout << endl;
    return 0;
} 

使用汇编可以利用ASCII表,字母表和数字表之间的间隔 7 直接转换, 效率明显比C++高多了,但是看代码的时候,直观性很差。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值