Tôi hiện đang viết một trình biên dịch C đơn giản, lấy một tệp .c làm đầu vào và tạo mã lắp ráp (cú pháp X86, AT & T). Everyting là tốt, nhưng khi tôi cố gắng thực hiện một hướng dẫn IDIVQ, tôi nhận được một ngoại lệ dấu chấm động. Dưới đây là đầu vào của tôi:Lắp ráp X86 - Xử lý lệnh IDIV
int mymain(int x){
int d;
int e;
d = 3;
e = 6/d;
return e;
}
Và đây là mã được tạo của tôi:
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
Theo http://www.cs.virginia.edu/~evans/cs216/guides/x86.html, idivq% RBX nên sản xuất 6/d (quotient) trong % rax. Nhưng tôi nhận được một ngoại lệ dấu phẩy động, và tôi dường như không thể tìm ra vấn đề.
Mọi trợ giúp sẽ được đánh giá cao!
Không liên quan đến câu hỏi này, nhưng bạn nên thực hiện 'movq% rdi, -40 (% rbp)' mà không điều chỉnh đăng ký 'esp'? Hoặc là OK vì vùng màu đỏ x64 '? –