assembly 为什么当我转换字符串中的数字时,减号在数字后面?

wribegjk  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(88)

我已经在Netwide Assembler上编写了将整数转换为字符串的代码,但控制台的输出是错误的。如果它能帮助我在x64架构下的Windows 10上编写代码。
我试图编写一个过程 _int_to_string,但在控制台中得到了其他输出。

section .bss
    STD_OUTPUT_HANDLE: equ -11
    char_written: resb 1
    buffer: resb 32

section .text
    extern GetStdHandle
    extern WriteConsoleA
    extern ExitProcess

    global _start

    _print:
        sub rsp, 40

        mov rcx, STD_OUTPUT_HANDLE          
        call GetStdHandle                   ;returns value for handle to rax

        mov rcx, rax
        mov r9, char_written

        mov rax, qword 0                    ;fifth argument
        mov qword [rsp+32], rax

        call WriteConsoleA
        add rsp, 40
        ret
    
    _start:
        mov rcx, buffer
        mov rdx, -24567789
        call _int_to_string

        mov rdx, rax
        mov rcx, rax
        call _len
        mov r9, rax
        call _print

        mov rcx, qword 0
        call ExitProcess
    _int_to_string: ; this procedure uses rcx, rdx, r8 register. Keep this in mind
        mov r8, 10
        mov rax, rdx
        cmp rdx, 0
        jns T1
        neg rdx
        mov byte [rcx], '-'
        dec rcx
        mov rax, rdx
        T1:
            xor     rdx,rdx
            div     r8
            add     rdx, 48              ; convert the digit to ASCII
            mov     BYTE [rcx], dl   ; store the character in the buffer
            dec     rcx                 ; decrement ecx pointing the buffer
            test    rax,rax             ; check if the quotient is 0
            jnz     T1
        inc     rcx
        mov     rax, rcx            ; eax points the string in the buffer
        ret
    _len:
        cmp byte [rcx], 0
        jz  lpend
        inc rcx
        jmp _len
    lpend:
        sub rcx, rdx
        mov rax, rcx
        ret

字符串
控制台的输出为“24567789-"。
正如您所理解的,我预期的输出如下:“-24567789”。“
我是汇编语言的初学者,所以我不知道我应该做什么。如果我的英语不好的话,我很抱歉。它不是我的母语,我学它。
我的所有工具:NASM x64、Golink、控制台、Visual Studio代码。

3ks5zfa0

3ks5zfa01#

  • 您正在从右到左构建您的数字**。如果你想在数字的左边有一个负号,那么不要立即输出它,而是推迟到所有的数字都被存储了。

您可以使用pushf来保留数字与零比较的结果(您可以使用test指令来完成)。

  • 你的代码也溢出了32字节的缓冲区的左边!如果您要使用递减地址,则从缓冲区的高位(而不是最低地址)开始。
; IN (rdx,rcx)
_int_to_string: ; uses rcx, rdx, r8 register. Keep this in mind
  add  rcx, 32     ; Begin at the end of the buffer
  mov  r8d, 10     ; CONST
  mov  rax, rdx
  test rax, rax
  pushf            ; (1)
  jns  T1
  neg  rax

T1:
  dec  rcx         ; Position for the following digit
  xor  edx, edx
  div  r8
  add  edx, 48     ; convert the digit to ASCII
  mov  [rcx], dl   ; store the character in the buffer
  test rax, rax    ; check if the quotient is 0
  jnz  T1

  popf             ; (1)
  jns  T2
  dec  rcx
  mov  byte [rcx], '-'
T2:
  mov  rax, rcx    ; RAX points the string in the buffer
  ret

字符串

相关问题