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