2
; NASM
push 30 ; '0'

mov rax, 4 ; write
mov rbx, 1 ; stdout
mov rcx, rsp ; ptr to character on stack
mov rdx, 1 ; length of string = 1
int 80h

上記のコードは stdout に何も出力しません。の文字にptrを与えると機能しsection .dataます。私は何を間違っていますか?

4

2 に答える 2

5

amd64は、システム コールに とは異なる方法を使用しますがint 0x80、インストールされている 32 ビット ライブラリなどでも動作する可能性がx86あります。

mov eax, SYSCALL_NUMBER
mov ebx, param1
mov ecx, param2
mov edx, param3
int 0x80

amd64代わりにこれを行います:

mov rax, SYSCALL_NUMBER_64 ; different from the x86 equivalent, usually
mov rdi, param1
mov rsi, param2
mov rdx, param3
syscall

やりたいことについては、次の例を検討してください。

        bits 64
        global _start

section .text

_start:
        push            0x0a424242
        mov             rdx, 04h
        lea             rsi, [rsp]
        call            write
        call            exit
exit:
        mov             rax, 60     ; exit()
        xor             rdi, rdi    ; errno
        syscall

write:
        mov             rax, 1      ; write()
        mov             rdi, 1      ; stdout
        syscall
        ret
于 2012-04-11T14:24:15.287 に答える
1

10 進数の 30 は、ASCII の「レコード区切り」のコードです。それが何であれ、それはおそらく印刷可能な文字ではありません.

一方、16 進数の 30 (NASM 用語では 30h または 0x30) は、ASCII "0" のコードです。

また、64 ビット ABI を使用する必要があります。

于 2012-04-11T12:41:45.743 に答える