我在使用NASM程序集实现二进制,八进制和十六进制转换的正确十进制时遇到了一些问题。我有大部分代码如下,我知道有些问题我仍在努力修复。我在代码中评论了相关信息。
{{1}}
测试的当前输出16位数155: 二进制:11011001 八月:332 十六进制:119
答案 0 :(得分:2)
您的代码有3个主要问题:
您的代码还有其他问题:
PutInt
是函数调用还是内联代码,或者它使用/删除了哪些寄存器)并且无法正确地优化它周围的指令< / LI>
对于第一个问题,最好的方法是以相反的顺序在内存中构建一个字符串,然后打印生成的字符串。对于第二个问题,您需要停止使用PutInt
- 每个数字都应转换为字符。
例如(32位80x86,NASM,未经测试):
;Convert unsigned integer to string
;
;Input
; eax = integer
; ebx = base
;
;Output
; edi = address of string
;
;Trashed
; eax,edx
section .bss
tempString: resb 33 ;Worst case string size is 32 digits
; (for base2), plus string terminator
tempStringEnd:
section .text
convertIntegerToString:
mov byte [tempStringEnd-1],0 ;Store string terminator
mov edi,tempStringEnd-2 ;edi = address to store last character
.nextDigit:
xor edx,edx ;edx:eax = current value
div ebx ;eax = new current value, edx = next digit
add dl,'0' ;dl = character for next digit maybe
cmp dl,'9' ;Is the character correct?
jbe .gotChar ; yes
add dl,'A'-'0'-10 ; no, fix it up
.gotChar:
mov [edi],dl ;Store the character
dec edi ;edi = address for next character
test eax,eax ;Is the current value zero?
jne .nextDigit ; no, do the next digit
ret ;Done, EDI = address of completed string