我已经使用了一个简单的算法将数字转换为字符串,这是我在SO上调整的,我已根据自己的目的进行了调整,但它并不完全符合我的需要。 我有一个字符串:
string point, "xxx points"
并且不变:
const10 dd 10
points dd 50 ; range from 0 - 990
调整后的例程
mov eax, [points] ; number to be converted
.convNum:
push eax
push edx
xor edx,edx
div dword [const10] ;eax = result, edx = remainder
cmp eax, dword 0 ; test of the res
je .print
jmp .convNum
.print:
lea eax,[edx+'0']
mov [point], dword eax ; need to replace xxx in string by number
pop edx
pop eax
这个没有按预期工作,因为它只显示一个数字,我理解,但我无法以我想要的方式更改例程。
修改
添加另一个版本的代码
push eax
push edx
mov eax, [points]
.convNum:
xor edx,edx
div dword [const10]
lea eax,[edx+'0']
mov ecx,[counter]
cmp ecx, 1
jne .next
mov [point+2], byte al
mov eax,[points]
div dword [const10]
jmp .again
.next:
cmp ecx, 2
jne .next2
mov [point+1], byte al
mov eax,[points]
div dword [const10]
div dword [const10]
jmp .again
.next2:
mov ecx,[p_bodu]
cmp ecx, 100
jb .kend
mov [point], byte al
jmp .kend
.again:
inc ecx
mov [counter],ecx
jmp .convNum
.kend:
pop edx
pop eax
此代码将数字从最低到最高。像120这样的数字转换得很好,但数字如130,150转换为630,650,再次数字140转换良好
答案 0 :(得分:4)
你继续推动EAX和EDX循环。你只需要这样做一次。
将 .convNum 标签下移2行:
mov eax, [points] ; number to be converted
push eax
push edx
.convNum:
xor edx,edx
div dword [const10] ;eax = result, edx = remainder
cmp eax, dword 0 ; test of the res
jne .convNum
.print:
另请注意,您应该写一个字节而不是双字:
mov [point], al ;
您编写的代码只会处理所提供值的最高位。要继续检索较低位置的数字,您需要从数字中减去当前数字时间(倍数)10并重复代码。
答案 1 :(得分:3)
所以你想要替换" xxx"。添加空格(" xxx")并且您想要替换适合32位寄存器的4个字节(= 1个双字)。寄存器将被存储" little endian"。如果将0x20303531存储到存储器,则它将显示为0x31 0x35 0x30 0x20,这是" 150"的ASCII代码。
以下是NASM的一个示例:
SECTION .data
point db "xxx points", 0
const10 dd 10
points dd 150 ; range from 0 - 990
SECTION .text
...
mov ebx, 0x20202020 ; 4 spaces
mov eax, [points] ; number to be converted
.convNum:
xor edx,edx
div dword [const10] ; eax = result, edx = remainder
shl ebx, 8 ; shift last result
mov bl, dl ; copy remainder to the last byte of EBX
or bl, '0' ; to ASCII
test eax, eax ; test of the res
je .print
jmp .convNum
.print:
mov [point], ebx ; need to replace xxx in string by number
...
我无法发布完整的程序,因为我不了解您的操作系统。