题目要求
基数转换程序
将寄存器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++高多了,但是看代码的时候,直观性很差。