基数转换子程序

    xiaoxiao2021-03-25  80

    题目要求

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

    转载请注明原文地址: https://ju.6miu.com/read-14013.html

    最新回复(0)