77 lines
1.5 KiB
ArmAsm
77 lines
1.5 KiB
ArmAsm
; FreeBSDで、死すコール番号を調べるには:/usr/include/sys/syscall.h
|
||
; Linuxで、死すコール番号を調べるには:/usr/include/asm-generic/unistd.h
|
||
; 下記のコードはFreeBSD向けの物です。
|
||
|
||
bits 64
|
||
default rel
|
||
|
||
section .data
|
||
hdr2 db "960 540", 10
|
||
hdr3 db "255", 10
|
||
|
||
section .rodata
|
||
outfile db "output.ppm", 0
|
||
hdr1 db "P6", 10
|
||
err db "開くに失敗", 10
|
||
errlen equ $-err
|
||
|
||
w equ 960
|
||
h equ 540
|
||
|
||
section .text
|
||
global _start
|
||
|
||
_start:
|
||
mov rax, 5 ; sys_openat
|
||
lea rdi, [outfile]
|
||
mov rsi, 0x100601 ; 0x100601 = 0001 0000 0000 0110 0000 0001 = 1048576 + 1024 + 512 + 1 = 1050113
|
||
; O_WRONLY = 0x0001
|
||
; O_CREAT = 0x0200
|
||
; O_TRUNC = 0x0400
|
||
; O_CLOEXEC = 0x010000
|
||
; /usr/include/sys/fcntl.h
|
||
mov rdx, 0o666 ; chmod 666
|
||
syscall
|
||
|
||
test rax, rax
|
||
js error ; エラーがあれば
|
||
mov rbx, rax ; ファイルディスクリプターをrbxに保存
|
||
|
||
mov rax, 4 ; sys_write
|
||
mov rdi, rbx ; fd
|
||
lea rsi, [hdr1]
|
||
mov rdx, 3
|
||
syscall
|
||
|
||
mov rax, 4
|
||
mov rdi, rbx
|
||
lea rsi, [hdr2]
|
||
mov rdx, 8
|
||
syscall
|
||
|
||
mov rax, 4
|
||
mov rdi, rbx
|
||
lea rsi, [hdr3]
|
||
mov rdx, 4
|
||
syscall
|
||
|
||
mov rax, 6 ; sys_close
|
||
mov rdi, rbx
|
||
syscall
|
||
|
||
end:
|
||
mov rax, 1 ; sys_exit
|
||
xor rdi, rdi
|
||
syscall
|
||
|
||
error:
|
||
mov rax, 4
|
||
mov rdi, 2 ; stderr
|
||
lea rsi, [err]
|
||
mov rdx, errlen
|
||
syscall
|
||
|
||
mov rax, 1
|
||
mov rdi, 1
|
||
syscall
|