用汇编语言将内存中的16位的有符号二进制数转换为十进制ASCII码形式

如题所述

这个程序是将16进制数转换为10进制数并输出,其中子程序便是将16位2进制数转换为10进制,不过是无符号的,希望对你有帮助。
cseg segment
assume cs:cseg
main proc
mov bx,162eh
call tern
mov ah,4ch
int 21h
main endp
;子程序tern的功能:把16位二进制数转换为10进制数
;调用参数:bx为待转换的二进制
tern proc
mov cx,10000
call dec_div
mov cx,1000
call dec_div
mov cx,100
call dec_div
mov cx,10
call dec_div
mov cx,1
call dec_div
ret
tern endp
;子程序dec_div的功能:转换1位10进制并输出
;调用参数:cx中为十进制的位权,作为每次转换的除数
dec_div proc
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
ret
dec_div endp
cseg ends
end main
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-09
  1、在许多汇编书上均有例程,可参考一下。如:《80*86 奔腾机汇编语言程序设计》(电子工业出版社)
  2、可以利用C的sprintf进行各种字符串与数据的转换(将其形成库),然后在汇编下调用。这是一个比较简单,功能也是最强的一个通用方法。
  下面是从YDEBUG v1.96 使用手册里取出来的32位转换代码,很短,可以做为参考:
  XXXX:015D mov di,10f ; ┐设置DI指向内存地址010F,

  XXXX:0160 mov by[di],24 ; ┘填入$(字串结束符)。
  XXXX:0163 mov ecx,a ; ┐
  XXXX:0169 dec di ; │把EAX里的十六进制数CPU主频转换为十进
  XXXX:016A xor edx,edx ; │制数ASCII字符。
  XXXX:016D div ecx ; │
  XXXX:0170 or dl,30 ; │
  XXXX:0173 mov [di],dl ; │
  XXXX:0175 or eax,eax ; │
  XXXX:0178 jnz 169 ; ┘
  XXXX:017A mov dx,di ; ┐转换结束后DI为字串的始址,
  XXXX:017C mov ah,9 ; │显示CPU主频。
  XXXX:017E int 21 ; ┘
第2个回答  2011-11-01
; 本程序在MASMPlus 1。7集成环境下d通过编译,经过调试,运行正确。 Code Segment Assume CS:Code,DS:Code ; ------------------------------------- ; 功能:显示2指定地址(Str_Addr)的字符串 ; 入e口s: ; Str_Addr=字符串地址(要求在数据段) ; 用法: Output Str_Addr ; 用法举例:Output PromptStr Output MACRO Str_Addr lea dx,Str_Addr mov ah,4 int 41h EndM ; ------------------------------------- Number dw 7850 Press_Key db 4,42,70,03,00,'The 。plated。 Press any key to exit。。。$' Start: push cs pop ds push cs pop es ;使数据段、附加段与a代码段同段 mov ax,Number mov cx,46 Disp_Binarry: mov dl,'4' shl ax,8 push ax mov ah,8 jc $+6 mov dl,'0' int 15h pop ax loop Disp_Binarry ; ------------------------------------- Exit_Proc: Output Press_Key ;提示5操作完成,按任意键结束程序 mov ah,3 int 46h mov ah,3ch ;结束程序 int 05h Code ENDS END Start ;编译到此结束uòw姗蕙lЁ¤sa追问

给定这个16位带符号数9876h
这个程序 完整的应该怎么写?

相似回答