gpt4 book ai didi

assembly - 我自己的 Improvised 编译器错误

转载 作者:行者123 更新时间:2023-12-02 00:02:12 26 4
gpt4 key购买 nike

我正在使用 Monodevelop 在 Linux 上的 C# 中构建 C 编译器子集。我的编译器从文件中读取文本并输出到程序集。现在我首先要注意我遇到的问题不是 C# 问题,而是程序集的误解。我正在使用 nasm 汇编器和 gcc 链接器。这是输出的程序集:

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) 文件并将它与另一个 Working(测试过的)目标代码文件(具有 systemsame()< 的定义)链接readinput()getdest())使用海湾合作委员会。我收到以下奇怪的错误:

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

最佳答案

在我看来,错误很可能是 cmp byte [a] , b 因为它就在错误消息中提到的标签之后,并且涉及 中定义的符号。 bss,错误信息中提到的部分。这条指令本身在我看来很可疑,但确切的错误还不是很清楚:也许 b 的地址被用作立即数,这将涉及将其截断为 8 位。

仔细检查这实际上是您想要的翻译。我怀疑您应该将 b 处的值加载到备用寄存器中,然后将其用作 cmp 的第二个操作数。

作为旁注,您应该为函数内部的基本 block 使用“本地”标签。否则汇编程序将浪费时间和空间来创建无用的重定位。通常这只涉及以某种方式为这些标签添加前缀。例如,对于 GNU as,它是 .L - 请查阅您所针对的汇编器的手册。

关于assembly - 我自己的 Improvised 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20657633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com