汇编 64 位 NASM

标签 assembly 64-bit nasm

我正在做一个项目。在 64 位 NASM 中。我必须将十进制转换为二进制,将二进制转换为十进制。

当我调用 printf 时,我在调试后一直出现段错误。

    extern printf

section .bss
decsave:    resd    2   ; stores dec->bin conversion
binsave:    resd    1  

section .data       ; preset constants, writeable
dec1:    db '1','2','4','.','3','7','5',0
bin1:    dq  01010110110101B ; 10101101.10101 note where binary point should be
ten:     dq     10
debug:  db "debug 124 is %ld", 10, 0

section .text       ; instructions, code segment
    global   main       ; for gcc standard linking
main:               ; label
    push    rbp             ; save rbp

;parse and convert integer portion of dec->bin     
        mov     rax,0       ; accumulate value here
        mov     al,[dec1]   ; get first ASCII digit
        sub     al,48       ; convert ASCII digit to binary
        mov     rbx,0           ; clear register (upper part)
        mov     bl,[dec1+1]     ; get next ASCII digit
        sub     rbx,48          ; convert ASCII digit to binary
        imul    rax,10          ; ignore rdx
        add     rax,rbx         ; increment accumulator
    mov rbx,0
    mov bl,[dec1+2]
    sub rbx,48
    imul    rax,10
    add rax,rbx
    mov [decsave],rax   ; save decimal portion

        mov rdi, debug
    mov rsi, [decsave]
    mov rax,0
    call    printf  

    ; return using c-style pops to return stack to correct position 
; and registers to correct content

        pop     rbp
    mov rax,0       
        ret                     ; return





; print the bits in decsave:
        section .bss
abits:  resb    17              ; 16 characters & zero terminator

    section .data
fmts:   db      "%s",0


section .text
; shift decimal portion into abits as ascii
        mov     rax,[decsave]   ; restore rax to dec. portion
        mov     rcx,8           ; for printing 1st 8 bits
loop3: mov     rdx,0           ; clear rdx ready for a bit
        shld    rdx,rax,1       ; top bit of rax into rdx
        add     rdx,48          ; make it ASCII
        mov     [abits+rcx-1],dl ; store character
        ror     rax,1           ; next bit into top of rax
        loop    loop3          ; decrement rcx, jump non zero

        mov     byte [abits+7],'.' ; end of dec. portion string
        mov     byte [abits+8],0   ; end of "C" string
        push    qword abits     ; string to print
        push    qword fmts      ; "%s"
        call    printf
        add     rsp,8

    mov     rax,[decsave+16]     ; increment to fractional portion
    mov     rcx,16       ; for printing 3 bits as required in the directions


loop4: mov     rdx,0           ; clear rdx ready for a bit
        shld    rdx,rax,1       ; top bit of rax into rdx
        add     rdx,48          ; make it ASCII
        mov     [abits+rcx-1],dl ; store character
        ror     rax,1           ; next bit into top of rax
        loop    loop4          ; decrement rcx, jump non zero

        mov     byte [abits+3],10 ; end of "C" string at 3 places
        mov     byte [abits+4],0 ; end of "C" string
        push    qword abits     ; string to print
        push    qword fmts      ; "%s"
        call    printf
        add     rsp,8

有没有其他方法可以解决这个问题?

谢谢。

最佳答案

正如 Jester 所指出的,如果可变参数函数不使用 sse,则 al 必须为零。这里有一个更大的问题:

使用 x86-64 调用约定,参数不会像 32 位那样在堆栈上传递,而是通过寄存器传递。哪些寄存器都取决于你的程序是为什么操作系统编写的。

x86 calling conventions

关于汇编 64 位 NASM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647906/

相关文章:

assembly - 如何使用 NASM 组装 16 位 asm 代码,然后在 Linux 中对其进行调试,然后再在 DOSBox 中生成可执行文件

c - 哪种机制知道程序的入口点是main()

linux - 调用 sys_read 两次 [Nasm, Linux]

linux - 我的汇编程序中出现段错误

c - 使用局部变量组装 intel x86 调用函数

macos - 我在 ASM 中的 strdup

linux - x86 程序集,没有遵循小字节序(或者是?)(Linux)

c - Visual Studio C 编译器中是否有单独的 bitset64 内在函数?

algorithm - ASM算法解码

android - 如何检查 react-native 库的 64 位兼容性