AST(Abstract Syntax Tree) 확인은 아래와 같이 한다. 컴파일러 백엔드가 생성된 AST를 최적화한다.
clang -Xclang -ast-dump -fsyntax-only dasomoli.c
AST(Abstract Syntax Tree) 확인은 아래와 같이 한다. 컴파일러 백엔드가 생성된 AST를 최적화한다.
clang -Xclang -ast-dump -fsyntax-only dasomoli.c
가장 큰 차이점은 operands의 순서이다.
Intel-syntax가 mnemonic destination, source 인데 반해, AT&T Syntax의 일반적인 형식은 다음과 같다.
mnemonic source, destination
모든 IA-32 아키텍처의 레지스터 이름은 앞에 ‘%’가 붙는다.
mov %ax, %bx
위의 예제는 16비트 레지스터 AX로부터의 값을 16비트 레지스터 BX로 옮긴다.
모든 상수 값들은 앞에 ‘$’가 붙는다.
mov $100, %bx
mov $A, %al
AT&T 문법에서 메모리는 다음 방식으로 참조된다.
segment-override:signed-offset (base,index,scale)
일부는 생략 가능하다.
%es:100 (%eax,%ebx,2)
offset과 scale은 앞에 ‘$’가 붙으면 안된다.
GAS memory operand NASM memory operand ------------------ ------------------- 100 [100] %es:100 [es:100] (%eax) [eax] (%eax,%ebx) [eax+ebx] (%ecx,%ebx,2) [ecx+ebx*2] (,%ebx,2) [ebx*2] -10(%eax) [eax-10] %ds:-10(%ebp) [ds:ebp-10]
예제
mov %ax, 100 mov %eax, -100(%eax)
첫번째 예제는 ax 레지스터의 값을 (기본인) data segment 레지스터의 offset 100으로 옮기는 것이다.
두번째 예제는 eax 레지스터의 값을 [eax-100]으로 옮기는 것이다.
상수 값을 메모리로 옮길 때, size-of-transfer나 operand-size를 지정할 필요가 있다. 다음 예제에서는 transfer size는 없고, 값 10을 메모리 offset 100으로 옮기는 것만 지정되어 있다.
mov $10, 100
NASM에서는 캐스팅 키워드 byte / word / dword 등을 붙여서 이를 한다. AT&T 문법에서는 이를 instruction에 suffix b/w/l을 붙여서 한다. 예를 들면 다음은 byte 값 10을 [ea:eax] 위치로 옮긴다
movb $10, %es:(%eax)
다음은 long 값 10을 같은 위치로 옮긴다.
movl $10, %es:(%eax)
아래도 그 예제들이다.
movl $100, %ebx pushl %eax popw %ax
jmp, call, ret 같은 instruction들은 프로그램의 한 곳에서 다른 곳으로 제어를 넘긴다. 이는 같은 코드 세그먼트 (near) 로 또는 다른 코드 세그먼트 (far) 로 제어를 넘길 수 있다. 가능한 브랜치 주소 지정 타입은 relative offset (label), register, memory oerand, 그리고 segment-offset pointers이다.
Relative offsets은 아래처럼 labels을 사용한다.
label1: . . jmp label1
Register나 memory operands를 사용하는 브랜치 주소 지정은 ‘*’를 앞에 붙여야만 한다. “far” 제어 넘김을 지정하기 위해서는 ‘ljmp’, ‘lcall’ 등과 같이 ‘l’을 앞에 붙여야 한다. 다음이 그 예제이다.
GAS syntax NASM syntax ========== =========== jmp *100 jmp near [100] call *100 call near [100] jmp *%eax jmp near eax jmp *%ecx call near ecx jmp *(%eax) jmp near [eax] call *(%ebx) call near [ebx] ljmp *100 jmp far [100] lcall *100 call far [100] ljmp *(%eax) jmp far [eax] lcall *(%ebx) call far [ebx] ret retn lret retf lret $0x100 retf 0x100
Segment-offset pointers는 다음 형식을 사용해서 지정한다:
jmp $segment, $offset
다음이 그 예제이다.
jmp $0x10, $0x100000
더 자세한 GNU assembler에 대해서 더 자세히 알고 싶으면 문서를 참고하자.
참고: https://csiflabs.cs.ucdavis.edu/~ssdavis/50/att-syntax.htm
.vimrc
같은건 대충 필요한 것만 그때 그때 써서 썼는데 새 환경에서 하나하나 쓰려니 귀찮다. 복사해서 쓸 수 있게 여기다 하나 써두고 업데이트하자.
syntax on
set autoindent
set cindent
:set smartindent
set noexpandtab
set nu
set hlsearch
set ts=4
set shiftwidth=4
set laststatus=2
set statusline=\ %<%l:%v\ [%P]%=%a\ %h%m%r\ %F\
set incsearch
colorscheme elflord
set tags=./tags,tags
set tags+=/usr/src/linux/tags
set tags+=../tags
set tags+=../../tags
set tags+=../../../tags
highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
이게 ARM에만 관련된 것인지는 확실치 않다.
일단 ARM Compiler toolchain Assembler Reference에 IT instruction에 관한 설명(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/Cjabicci.html)이 있다.
IT는 (If-Then) instuction을 말한다. 이름에서 알 수 있듯이, 분류는 Branch and control instruction 이다. IT instruction은 4개의 이어지는 instructions conditional로 구성되는데, 이를 IT block이라고 한다. 이들 condition은 모두 같을 수도, 일부는 다른 것들과 논리적으로 반대일 수도 있다. 이 instruction이 conditional flags를 바꾸지는 않는다.
IT{x{y{z}}} {cond} 로 쓰인다.
x는 그 IT block에서 두번째 instruction을 위한 condition switch, y는 세번째, z는 4번째, cond는 첫번째이다.
IT block의 2번째에서 4번째 instruction은 다음 중 하나일 수 있다:
T: Then. cond condition이 적용된다.
E: Else. cond의 반대 condition이 적용된다.
BKPT instruction을 제외한 IT block 안의 (branches를 포함하는) instrcution들은 {cond} 부분에 condition을 적어야 한다.
assembler가 뒤의 instruction에 적힌 condition에 따라 자동으로 생성해주므로, IT instrcution을 작성할 필요는 없다. IT instruction을 작성한다면, assembler가 그 validity를 체크한다.
ARM code를 assembling할 때 assembler가 같은 체크를 하지만, IT instrcution을 생성하지는 않는다.
CMP, CMN, TST를 제외한 condition code flags에 영향을 주지 않는 16-bit instrcution들은 IT blcok안에서 사용되어도 상관없다.
IT block 안의 BKPT instrcution은 언제나 실행되기 때문에 {cond} 부분 안에 condition은 필요없다. IT bock은 그 다음 instrcution부터 이어진다.
NOTE: AL condition을 사용함으로써 unconditional instruction을 위한 IT block을 사용할 수 있다.
IT block 안에서의 conditional branches는 IT block 밖에 있는 것보다 더 긴 branch range를 갖는다.
IT block 안에 다음 instruction들은 허용되지 않는다
IT block이 사용될 때 다른 제한은 다음과 같다.
NOTE: assembler는 IT block 안에서 이들 instruction들이 사용되면 disgnostic message를 출력한다.