我是 riscv 的新手,我对 la 和 lw 感到困惑。
我知道它la代表加载地址并lw代表加载字。如果VAL的地址是, VAL的0x100数据值是,x3应该存储0x11 ,x4应该存储0x11吗?0x110x100
la x7, VAL
sw x3, 0(x7)
lw x4, VAL
bne x4, x3
Run Code Online (Sandbox Code Playgroud) 我们知道jal指定了一个 21 位的偏移量。但是,它不编码 21 位偏移量而是编码 20 位偏移量。原因是地址的最低有效位始终为零,因为最小可能的 RISC-V 指令是 2 个字节,因此该位未在指令中编码。
通过以这种方式对偏移进行编码,它可以提供 ±1MiB 的跳跃范围。如果jal确实对 LSB 进行编码,它将仅提供 ±512KiB 的跳跃范围。
但是,jalr指定 12 位偏移量的指令确实对 LSB 进行了编码。这将跳跃范围减少到 ±2kiB(而不是 ±4kiB)。我知道它jalr使用 I 型格式,它与addi此类指令的立即数的 LSB 必须编码相同。但是,我认为没有理由必须对jalr.
(我是新手,所以说的可能有不准确的地方)
\n在我当前的思维模型中,溢出是一种算术现象(当我们执行算术运算时发生),而隐式转换是一种赋值(初始化与否)现象(当我们对右手的值不进行赋值时发生)适合左侧值。
\n然而,我经常看到“溢出”和“隐式转换”这两个概念可以互换使用,与我的预期不同。例如,来自 learncpp 团队的这段引用,谈论了有符号 int 的溢出和“位不足”:
\n\n\n当我们尝试存储超出类型范围的值时,就会发生整数溢出(通常简称为溢出)。本质上,我们试图存储的数字需要比对象可用的位数更多的位数来表示。在这种情况下,数据会丢失,因为对象没有足够的内存来存储所有内容[1]。
\n
这是关于 unsigned int 的溢出:
\n\n\n如果我们尝试将数字 280(需要 9 位来表示)存储在 1 字节(8 位)无符号整数中,会发生什么情况?答案是溢出 [2]*
\n
尤其是这个,他使用“模换行”:
\n\n\n这里\xe2\x80\x99是思考同一件事的另一种方式。任何大于该类型可表示的最大数字的数字都简单地 \xe2\x80\x9c 包裹 \xe2\x80\x9d (有时称为 \xe2\x80\x9cmodulo 包裹 \xe2\x80\x9d)。255 在 1 字节整数范围内,因此 255 就可以了。然而,256 超出了范围,因此它回绕到值 0。257 回绕到值 1。280 回绕到值 24 [2]。
\n
在这种情况下,据说超出左手限制的赋值会导致溢出,但我希望在这种情况下使用术语“隐式转换”。
\n我看到术语“溢出”也用于其结果超出左侧限制的算术表达式。
\n我想是这样。在参考文献 [3] 的“数值转换 - 积分转换”部分中,对于无符号整数:
\n\n\n[...] 结果值是等于源值模 2^n\n 的最小无符号值,其中 n 是用于表示目标类型的位数 [3]。
\n
对于签名(粗体我的): …
c++ assembly integer-overflow language-lawyer implicit-conversion
我很困惑。当我在二进制文件中汇编压缩指令子集时,我得到了 32 位指令,但我认为我会得到 16 位指令,因为 RVC 子集是用 16 位编码的。RVC(压缩)子集中的指令在汇编后是否总是扩展为 32 位指令,或者它们应该是 16 位长?RISC-V的官方指令集手册中是这么写的:
RVC 是在每个 RVC 指令扩展为基本 RISC-V 指令之一的约束下设计的:RV32I、RV64I 或 RV128I
出于教育目的,我使用https://godbolt.org/z/7F-Lhm进行翻译
// C++ code
char i = 3;
char A[] = {0,1,2,3,4,5};
int myfunction() {
return A[i];
}
Run Code Online (Sandbox Code Playgroud)
进入
# RISC-V instructions
myfunction(): # @myfunction()
lui a0, %hi(i)
lbu a0, %lo(i)(a0)
lui a1, %hi(A)
addi a1, a1, %lo(A)
add a0, a0, a1
lbu a0, 0(a0)
ret
i:
.byte 3 # 0x3
A:
.ascii "\000\001\002\003\004\005"
Run Code Online (Sandbox Code Playgroud)
但为什么是A[i]“装载” add a0, a0, a1,lbu a0, 0(a0)而不是“仅仅装载” lbu a0, a0(a1)?
lbu dest, offset(baseAdress)如果仅允许dest和baseAdresse为寄存器地址,而 …
的运算ADC是DEST ? DEST + SRC + CF, 的运算SBB是DEST ? (DEST – (SRC + CF))。让我感到困惑的是这些指令对 FLAGS 的影响。在 的情况下SBB,结合性是明确的,因此我假设它SBB等于(最终的寄存器状态)
jnc label
lea src, [src+1]
sub dest, src
lea src, [src-1]
jmp label2
label:
sub dest, src
label2:
Run Code Online (Sandbox Code Playgroud)
但是,在 , 的情况下ADC,将SRC首先添加到DEST,然后在其之上CF添加?这很重要,因为如果是这样,它会对 FLAGS 产生不同的影响。
Riscv32 和 Riscv64 有什么区别?我一直在研究 ISA 文档,但找不到任何地方明确提到它,所以现在很困惑。
不幸的是,我无法从谷歌找到任何关于此的文档。有什么指针吗?
我正在尝试从 SQL Server 2017 中的 .NET Core dll 创建程序集:
CREATE ASSEMBLY my_assembly
FROM 'C:\Temp\MyDll.dll' WITH PERMISSION_SET = SAFE;
Run Code Online (Sandbox Code Playgroud)
这是 dll csproj :
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SqlServer.SqlManagementObjects" Version="161.46041.41" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
当我运行查询时,出现以下错误:
程序集“MyAssembly”引用程序集“system.runtime, version=4.2.2.0,culture=neutral, publickeytoken=b03f5f7f11d50a3a.”,当前数据库中不存在该程序集。SQL Server 尝试从引用程序集来自的同一位置定位并自动加载引用程序集,但该操作失败(原因:2(系统找不到指定的文件。))。请将引用的程序集加载到当前数据库中,然后重试您的请求。
我该如何解决?
据我所知:
我不确定我是否正确,因为这些术语非常相似,有时我很难提及正确的事情。
assembly ×8
riscv ×5
c# ×1
c++ ×1
carryflag ×1
compilation ×1
instructions ×1
riscv32 ×1
x86 ×1
x86-64 ×1