将转换后的数字附加到现有字符串

时间:2015-12-10 10:35:53

标签: assembly

我已经使用了一个简单的算法将数字转换为字符串,这是我在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转换良好

2 个答案:

答案 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
...

我无法发布完整的程序,因为我不了解您的操作系统。