2012-04-27 9 views
21

현재 간단한 C 컴파일러를 작성 중이며 .c 파일을 입력으로 사용하고 어셈블리 코드 (X86, AT & T 구문)를 생성합니다. Everyting은 좋지만 IDIVQ 명령어를 실행하려고하면 부동 소수점 예외가 발생합니다. 여기 내 입력이다 : 여기X86 어셈블리 - IDIV 명령 처리

int mymain(int x){ 
    int d; 
    int e; 
    d = 3; 
    e = 6/d; 
    return e; 
} 

되어 내 생성 된 코드 :

mymain: 
.LFB1: 
    .cfi_startproc 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    movq %rsp, %rbp 
    .cfi_offset 6, -16 
    .cfi_def_cfa_register 6 
    movq %rdi, -40(%rbp) 
    movq $3, -8(%rbp) 
    movq $6, %rax 
    movq -8(%rbp), %rdx 
    movq %rdx, %rbx 
    idivq %rbx 
    movq %rax, -16(%rbp) 
    movq -16(%rbp), %rax 
    leave 
    .cfi_def_cfa 7, 8 
    ret 
    .cfi_endproc 
.LFE1: 
    .size mymain, .-mymain 

따르면 http://www.cs.virginia.edu/~evans/cs216/guides/x86.html에, idivq % RBX%의 RAX 6/D (몫)을 생성한다. 하지만 부동 소수점 예외가 발생하고 문제를 찾을 수 없습니다.

도움이 될 것입니다.

+0

,하지만 당신은'movq의 %의 RDI, -40 (%의 RBP)을 일을해야 '하지 않고는'등록 esp' 조정 한? 아니면 x64 '레드 존'때문에 괜찮습니까? –

답변

23

Mysticials 대답의 첫 번째 부분은 정확합니다. idiv은 128/64 비트 나누기를 수행하므로 배당금의 상위 64 비트를 포함하는 rdx의 값에 임의의 값이 없어야합니다. 그러나 제로 확장은 잘못된 길입니다. 당신이 서명 변수를 가지고

, 당신은 rdx:raxrax을 확장 기호해야합니다. 이에 대한 구체적인 지침은 cqto (쿼드에서 옥텟으로 변환)이며 인텔 구문에서는 AT & T 및 cqo입니다. AFAIK 최신 버전의 가스는 두 가지 이름을 모두 수용합니다. 이 질문에 관련없는

movq %rdx, %rbx 
cqto     # sign extend rax to rdx:rax 
idivq %rbx 
+0

+1 서명 된 부분을 간과 한 재밌는 이야기. – Mysticial

+0

실제로, 테스트를 실행하고 서명 된 값을 처리 할 때 오류가 발생했습니다. 나는이 지침을 전에 보지 못했지만 지금은 문제를 해결하는 것으로 보인다. 고맙습니다! –

+0

@Mysticial도 최고로 잘됩니다 :-) – hirschhornsalz

11

명령어는 128 비트 정수 (rdx:rax)를 피연산자로 나눕니다.

  • rax은 배당의 하위 64 비트를 유지합니다.
  • rdx은 배당의 상위 64 비트를 유지합니다.

몫이 64 비트에 맞지 않으면 부동 소수점 예외가 발생합니다.

movq %rdx, %rbx 
xorq %rdx, %rdx # zero "rdx" 
idivq %rbx 

당신이 부호있는 정수를 처리하는 경우도 rax 부호 비트를 복사하는 것을 의미, rdx:raxrax을 확장 로그인해야 : rdx 제로에

그래서 당신이해야 할 것입니다 rdx의 모든 비트와 cqo 별칭 cqto로 이루어집니다

movq %rdx, %rbx 
cqo 
idivq %rbx 
+5

rdx를 0으로 만들면 양수로 작동하지만 음수라면 아마도 rdx = -1이 필요합니다 ... 그렇지 않습니까? – marekb

+5

marekb가 옳다고 생각합니다.'xorq'는'rax'를'rdx : rax'로 확장하기 위해'cqo' 명령을 사용해서는 안됩니까? –

+0

이 경우 부호가있는 타이핑 : 나는 그렇다고 생각합니다. –

관련 문제