; 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
ます。私は何を間違っていますか?
; 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
ます。私は何を間違っていますか?
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
10 進数の 30 は、ASCII の「レコード区切り」のコードです。それが何であれ、それはおそらく印刷可能な文字ではありません.
一方、16 進数の 30 (NASM 用語では 30h または 0x30) は、ASCII "0" のコードです。
また、64 ビット ABI を使用する必要があります。