Intel記法とAT&T記法
アセンブリの記法には、「Intel記法」と「AT&T記法」の2種類がある
どっちがいいの?
個人的にはIntel記法の方が読みやすい
gccのデフォルトは AT&T 記法
-masm=intel オプションをつけることで Intel 記法で出力できる
Intel記法
オペランドの順序
第一オペランドが destination で、第二オペランドが source
mov eax, 0 (eax = 0)
レジスタの表記
レジスタ名のプリフィックスはなし
mov eax, 0
リテラルの表記
リテラルのプリフィックスはなし
mov eax, 0
AT&T記法
オペランドの順序
第一オペランドが source で、第二オペランドが destination
movl $0, %eax (0 = eax)
レジスタの表記
レジスタ名の先頭に % をつける
movl $0, %eax
リテラルの表記
リテラルの先頭に $ をつける
movl $0, %eax
Intel記法のサンプル
code:Intel記法
// gcc -S -masm=intel -fno-asynchronous-unwind-tables foo.c
.file "foo.c"
.intel_syntax noprefix
.text
.globl main
.type main, @function
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR rbp-8, 4649 mov rdi, rax
mov eax, 0
call p
nop
leave
ret
.size main, .-main
.ident "GCC: (GNU) 13.2.0"
.section .note.GNU-stack,"",@progbits
AT&T記法のサンプル
code:AT&T記法
// gcc -S -fno-asynchronous-unwind-tables foo.
.file "foo.c"
.text
.globl main
.type main, @function
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movq $4649, -8(%rbp)
movq -8(%rbp), %rax
movq %rax, %rdi
movl $0, %eax
call p
nop
leave
ret
.size main, .-main
.ident "GCC: (GNU) 13.2.0"
.section .note.GNU-stack,"",@progbits