2013-12-18 3 views
3

Я создаю компилятор подмножества C в Linux на Linux, используя Monodevelop. Мой компилятор читает текст из файла и выводит его на сборку. Теперь я должен сначала заметить, что проблема, которую я получаю, не проблема C#, а недопонимание сборки. Я использую ассемблер nasm и gcc-компоновщик. Вот outputed сборка:Моя собственная Импровизированная ошибка компилятора

extern printf 
extern strcpy 
extern systemsame 
extern readinput 
extern getdest 
section .text 
global main 
jmp main_over 
main: 
push rax 
mov rax, 0 
mov rax, 1 
mov byte [a], al 
pop rax 
push rax 
mov rax, 0 
mov rax, 0 
mov byte [b], al 
pop rax 
IF_STATEMENT_0: 
cmp byte [a] , 1 
jne IF_STATEMENT_0_over 
mov rdi, QUOTE_0 
mov rax, 0 
call printf 
ret 
main_over: 
IF_STATEMENT_1: 
cmp byte [a] , 0 
jne IF_STATEMENT_1_over 
mov rdi, QUOTE_1 
mov rax, 0 
call printf 
ret 
IF_STATEMENT_1_over: 
IF_STATEMENT_2: 
cmp byte [a] , b 
jne IF_STATEMENT_2_over 
mov rdi, QUOTE_2 
mov rax, 0 
call printf 
ret 
IF_STATEMENT_2_over: 
IF_STATEMENT_3: 
cmp byte [a], 0 
je IF_STATEMENT_3 
mov rdi, QUOTE_3 
mov rax, 0 
call printf 
ret 
IF_STATEMENT_3_over: 
IF_STATEMENT_4: 
cmp byte [b], 0 
je IF_STATEMENT_4 
mov rdi, QUOTE_4 
mov rax, 0 
call printf 
ret 
IF_STATEMENT_4_over: 
ret 
IF_STATEMENT_0_over: 
section .bss 
a: resb 1 
b: resb 1 
tempbyte: resb 20 
tempword: resw 20 
tempdword: resd 20 

section .data 

;Passon extra bit from parsing state;;; 
QUOTE_0: db "a is 1!", 0 
QUOTE_1: db "a is 0!", 0 
QUOTE_2: db "a is b!", 0 
QUOTE_3: db "a is true!", 0 
QUOTE_4: db "b is true!", 0 

компилировать это с NASM ассемблер и получить NO Ошибки и NO предупреждения. я затем получить файл объектного кода (.o) и связать его с другим рабочей (проверено) файл объектного кода (который имеет определения для systemsame(), readinput() и getdest()) с помощью GCC. Я получаю странную ошибку:

In function `IF_STATEMENT_1_over': 
outout.asm:(.text+0x71): relocation truncated to fit: R_X86_64_8 against `.bss' 
collect2: error: ld returned 1 exit status 
+0

Кстати, извините, если мой код сборки нечитабелен в некоторых местах. Это связано с тем, что мой компилятор очень далек от совершенства. –

+0

Вы пишете «другой файл рабочего объекта», но только потому, что оба объектных файла являются законными сами по себе, это не значит, что они будут хорошо играть вместе - прочитайте о [ABI] (http://en.wikipedia.org/wiki/Application_binary_interface) для больше информации. Не сказать, что это причина проблемы здесь, просто комментарий. – Oak

+0

Он работал с предыдущими версиями моего «компилятора», поэтому объект определенно легально –

ответ

3

Мне кажется, что ошибка, вероятно, будет cmp byte [a] , b так, что только после метки, указанной в сообщении об ошибке, и включает в себя символы, определенные в .bss, раздел, упомянутый в сообщение об ошибке. Сама инструкция выглядит подозрительной для меня, но точная ошибка не совсем ясна: возможно, адрес b используется как немедленный, что связано с его усечением до 8 бит.

Двойная проверка, что это на самом деле перевод, который вы хотите. Я подозреваю, что вы должны загрузить значение b в запасной регистр, а затем использовать его как второй операнд до cmp.

В качестве примечания стороны вы должны использовать «локальные» метки для базовых блоков, встроенных в функцию. В противном случае ассемблер будет тратить время и пространство на создание бесполезных перемещений. Обычно это не что иное, как префикс этих меток каким-то образом. Например, для GNU as это .L - обратитесь к руководству ассемблера, на который вы нацеливаете.

Смежные вопросы