gpt4 book ai didi

compiler-errors - “lui a4,%hi(0x0001ff00)”的异常行为

转载 作者:行者123 更新时间:2023-12-02 10:58:19 24 4
gpt4 key购买 nike

我的%hi()汇编器功能有问题。
此问题特定于RISC-V GNU汇编器。编译程序:

lui     a4,%hi(0x0001ff00)     # Does not give what I expect
lui a4,0x1f #
.word 0x0001f737 #


riscv32-unknown-elf-as  -o strange_lui.o strange_lui.s
riscv32-unknown-elf-objdump -D strange_lui.o


strange_lui.o:     file format elf32-littleriscv
Disassembly of section .text:
00000000 <.text>:
0: 00020737 lui a4,0x20
4: 0001f737 lui a4,0x1f
8: 0001f737 lui a4,0x1f

我相信这三行应该编译为同一代码。那我在这里想念什么?我正在使用:
riscv32-unknown-elf-as  -v
GNU assembler version 2.31.1 (riscv32-unknown-elf) using BFD version (GNU Binutils) 2.31.1

最佳答案

%hi(...)函数比看起来更聪明。它不仅返回给定参数的前20位。
%hi预计将在lui指令中使用,不久之后将跟另一条指令add %lo(...)一起使用,该指令将通过提供低12位来完成寄存器的32位加载。

add指令执行期间,低12位将被符号扩展以产生32位值,然后将其添加到寄存器的原始内容中。当低位12的高位为0时,此符号扩展步骤对寄存器的现有高20位没有影响。但是,当低12位的高位为1时,符号扩展的作用是从寄存器的高20位的现有值中减去1。

在这种情况下,%hi(0x0001ff00)函数看到低位12的最左位为'1'。因此,它预期将由后面的add %lo(0x0001ff00)执行减法,并将0x00020写入寄存器的高20位。该0x00020将通过预期的符号扩展0001f转换为所需的add

如果要让程序为所有三个语句生成相同的指令,请给%hi一个参数,该参数的低12位在其最左位置为0。像lui %hi(0x0001f700)这样的东西就可以做到。

关于compiler-errors - “lui a4,%hi(0x0001ff00)”的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53379306/

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