小编Eri*_*idt的帖子

RISCV指令

我是 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)

assembly riscv

6
推荐指数
2
解决办法
3万
查看次数

为什么 JALR 对偏移量的 LSB 进行编码?

我们知道jal指定了一个 21 位的偏移量。但是,它不编码 21 位偏移量而是编码 20 位偏移量。原因是地址的最低有效位始终为零,因为最小可能的 RISC-V 指令是 2 个字节,因此该位未在指令中编码。

通过以这种方式对偏移进行编码,它可以提供 ±1MiB 的跳跃范围。如果jal确实对 LSB 进行编码,它将仅提供 ±512KiB 的跳跃范围。

但是,jalr指定 12 位偏移量的指令确实对 LSB 进行了编码。这将跳跃范围减少到 ±2kiB(而不是 ±4kiB)。我知道它jalr使用 I 型格式,它与addi此类指令的立即数的 LSB 必须编码相同。但是,我认为没有理由必须对jalr.

assembly instruction-set riscv instruction-encoding

6
推荐指数
1
解决办法
213
查看次数

溢出和隐式转换之间有什么区别,无论是技术级别还是位级别(cpu-寄存器级别)?

(我是新手,所以说的可能有不准确的地方)

\n

在我当前的思维模型中,溢出是一种算术现象(当我们执行算术运算时发生),而隐式转换是一种赋值(初始化与否)现象(当我们对右手的值不进行赋值时发生)适合左侧值。

\n

然而,我经常看到“溢出”和“隐式转换”这两个概念可以互换使用,与我的预期不同。例如,来自 learncpp 团队的这段引用,谈论了有符号 int 的溢出和“位不足”:

\n
\n

当我们尝试存储超出类型范围的值时,就会发生整数溢出(通常简称为溢出)。本质上,我们试图存储的数字需要比对象可用的位数更多的位数来表示。在这种情况下,数据会丢失,因为对象没有足够的内存来存储所有内容[1]。

\n
\n

这是关于 unsigned int 的溢出:

\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

我看到术语“溢出”也用于其结果超出左侧限制的算术表达式。

\n
\n

1 隐式转换和上溢/下溢之间有技术上的区别吗?

\n

我想是这样。在参考文献 [3] 的“数值转换 - 积分转换”部分中,对于无符号整数:

\n
\n

[...] 结果值是等于源值模 2^n\n 的最小无符号值,其中 n 是用于表示目标类型的位数 [3]。

\n
\n

对于签名(粗体我的): …

c++ assembly integer-overflow language-lawyer implicit-conversion

6
推荐指数
1
解决办法
215
查看次数

RISC-V 压缩指令子集 (RVC) 是否总是汇编成二进制文件中的 32 位指令?

我很困惑。当我在二进制文件中汇编压缩指令子集时,我得到了 32 位指令,但我认为我会得到 16 位指令,因为 RVC 子集是用 16 位编码的。RVC(压缩)子集中的指令在汇编后是否总是扩展为 32 位指令,或者它们应该是 16 位长?RISC-V的官方指令集手册中是这么写的:

RVC 是在每个 RVC 指令扩展为基本 RISC-V 指令之一的约束下设计的:RV32I、RV64I 或 RV128I

assembly compilation instructions riscv

4
推荐指数
1
解决办法
1564
查看次数

RISC-V加载指令中的地址偏移是否硬编码?

出于教育目的,我使用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, a1lbu a0, 0(a0)而不是“仅仅装载” lbu a0, a0(a1)

lbu dest, offset(baseAdress)如果仅允许destbaseAdresse为寄存器地址,而 …

assembly riscv

3
推荐指数
1
解决办法
6405
查看次数

ADC 和 SBB 的关联性

的运算ADCDEST ? DEST + SRC + CF, 的运算SBBDEST ? (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 产生不同的影响。

x86 assembly x86-64 carryflag

1
推荐指数
1
解决办法
107
查看次数

RISCV32 与 RISCV64

Riscv32 和 Riscv64 有什么区别?我一直在研究 ISA 文档,但找不到任何地方明确提到它,所以现在很困惑。

不幸的是,我无法从谷歌找到任何关于此的文档。有什么指针吗?

assembly riscv riscv32

1
推荐指数
1
解决办法
3767
查看次数

尝试从 .net core dll 创建程序集时出现 SQL Server 错误

我正在尝试从 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(系统找不到指定的文件。))。请将引用的程序集加载到当前数据库中,然后重试您的请求。

我该如何解决?

c# .net-assembly sql-server-2017 .net-core-3.1

1
推荐指数
1
解决办法
186
查看次数

地址空间、可寻址性、可字寻址、寻址模式之间有什么区别?

据我所知:

  • 地址空间:分配给程序或进程的可用内存量
  • 可寻址性:计算机识别不同内存位置的方式。
  • 字寻址:指大小等于“字”的内存单元,通常是一个字节,由单个二进制地址指向
  • 寻址方式:指指令操作数的指定方式

我不确定我是否正确,因为这些术语非常相似,有时我很难提及正确的事情。

assembly instruction-set cpu-architecture memory-address

0
推荐指数
1
解决办法
1573
查看次数