小编Pet*_*des的帖子

ROL 操作后溢出标志设置为 1,即使它应该是未定义的

我正在使用 emu8086 学习 8086 汇编,我正在玩一些旋转指令,至于我的问题,我知道对于超过 1 位移位/旋转,溢出标志 OF 的行为是未定义的。

但是当我尝试下面的代码时

MOV BH,72H

MOV CL,4

ROL BH,CL
Run Code Online (Sandbox Code Playgroud)

BH 寄存器中的结果为 27H,并且至于标志,进位和溢出标志被设置为 1,即使 OF 不应该被设置,因为它是未定义的。

有人可以解释一下 OF 是如何以及为什么设置在这里的吗?

x86 assembly bit-manipulation eflags emu8086

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

了解汇编中的函数何时为 void 或 int

所以我在汇编中有以下代码:

在此输入图像描述

我知道该函数的参数有两个(x 和 y 或任何字母)。问题是我不知道如何从汇编代码中查看该函数是否返回任何内容,因为它只说ret. 这个函数会被视为 void 或 int 吗?任何有助于理解的解释将不胜感激。

assembly reverse-engineering x86-64 att

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

ARM v7:32 位浮点的 SIMD 查找表

我有一个 float32 数字向量。对于每个元素,我必须找到 cos,sin

我想使用查找表而不是默认库。是否有 ARM 内部代码可以用于此目的?

arm intrinsics neon

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

如何根据 _m256i 元素的偶数或奇数有条件地创建 -1.0 和 +1.0 的 _m256d?

我对编译器 intrinsincs 很陌生。我有 4 个 uint64_t 整数存储在 _m256i 中。

__m256i vj = _mm256_setr_epi64x(1, 2, 3, 4);
__m256i one = _mm256_set_epi64x(1, 1, 1, 1);
__m256i vf = _mm256_and_si256(vj, one); // vf = {1, 0, 1, 0}
Run Code Online (Sandbox Code Playgroud)

我想得到一个__m256d res = {1.0, -1.0, 1.0, -1.0}基于 vf 的值,如下所示:

double value[2] = {-1.0, 1.0};
for(int i = 0; i < 4; i++)
    res[i] = value[vf[i]];
Run Code Online (Sandbox Code Playgroud)

从 vf 和 value 生成 res 的最佳方法应该是什么?非常感谢您的帮助。

simd intrinsics avx avx2

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

MSVC /Os 与 GCC -O2 的非常详细的 ASM 代码(用于简单的模板代码)

我正在寻找一些示例std::visit,并且我想探索一下以下常见示例代码:

#include <iostream>
#include <variant>

struct Fluid { };
struct LightItem { };
struct HeavyItem { };
struct FragileItem { };

template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>; // line not needed in C++20...

int main() {
    std::variant<Fluid, LightItem, HeavyItem, FragileItem> package(HeavyItem{});

    std::visit(overload{
        [](Fluid& )       { std::cout << "fluid\n"; },
        [](LightItem& )   { std::cout << "light item\n"; },
        [](HeavyItem& )   { std::cout << "heavy item\n"; },
        [](FragileItem& ) { std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ assembly compiler-optimization visual-c++

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

Assembly x86 MASM - 从内存中提取 5 位的问题

我有一个问题需要解决,但我不知道如何解决。我正在询问如何解决这个问题的一般想法。我有一个内存地址,在 ESI 中。内存代表某种简化的 ASCII 编码,其中 5 位依次表示一个特定字符。内存以五位结尾 - 00000b。为了转换为正常的 8 位 ASCII,必须将 60H 添加到每个 5 位值中。我想将每个 5 位编码字符存储为地址 EDI 下的 8 位 ASCII 编码。EDI 也必须以 0 - 00000000b 结尾。

示例: [ESI] = 00011 00010 11010 00000b [EDI] = 01100011 01100010 01111010 00000000b

我将如何从 esi 中逐个提取每 5 位?

x86 assembly bit-manipulation masm bit-fields

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

机器代码和汇编代码是架构的一部分吗?

汇编代码和机器代码是由架构指定的吗?我知道你如何实现架构对你来说是不重要的(微架构可以实现架构)。但我不明白汇编或机器代码是否是由架构指定的?

assembly instruction-set cpu-architecture machine-code micro-architecture

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

m1 mac,从程序集中调用 nanosleep

我想从程序集中调用类似 nanosleep 的东西,仅使用 SVC 调用。但仅使用我所拥有的有限信息,如何做到这一点并不明显,这个 macos 系统调用调用签名列表: https ://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls 。掌握

我试图弄清楚 C 在调用 nanosleep 时做了什么,我能够将其简化为:

struct timespec {  long tv_sec;  long tv_nsec; };

int nanosleep(const struct timespec *__rqtp, struct timespec *__rmtp)
__asm("_" "nanosleep" );

int main() {
    struct timespec remaining, request = { 3, 1 };
    int response = nanosleep(&request, &remaining); }
Run Code Online (Sandbox Code Playgroud)

我不确定那__asm是做什么的,因为这看起来不像组装。不管怎样,我在苹果的 libc 源代码中找到了一个实现nanosleep。它依赖于对 while 的调用clock_get_time,而 libc 中未定义该调用。我在 XNU 源代码中发现了一个提及clock_get_time,但这是在 .defs 文件中,我不知道它是什么,而且似乎没有实现。

无论如何,是否有一些关于 SVC 调用的更好文档,或者我可以在某个地方找到 libc SVC 实现的程序集?

非常感谢任何信息或想法。

macos assembly system-calls arm64 apple-m1

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

如何计算 __m128 变量。(另外 _mm_blendv_ps 是做什么的)?

所以我阅读了英特尔关于 _mm_blendv_ps 的文档,但不太明白该函数的真正作用。所以我写了下面的代码:

    __m128 a = { 18.0,4.0,19.0,21.0 };
    __m128 b = { 67.0,92.0,888.0,47.0 };
    __m128 mask = { 1.0,0.0,0.0,1.0 };

    __m128 result = _mm_blendv_ps(a, b, mask);
    cout << "Result is: " << result[0] << " " << result[1] << " " << result[2] << " " << result[4] << endl;
Run Code Online (Sandbox Code Playgroud)

但我收到错误“没有运算符 [] 与这些操作数匹配”。为什么我无法访问结果?结果不是32位浮点向量吗?

那么为什么我无法访问结果呢?我怎样才能访问它?cout 的结果是什么(blendv 做什么)?

c++ sse simd

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

为每个 int8_t 元素添加两个具有饱和度的向量(uint64_t 类型)

我最近面临一个给定的问题:

\n
\n

向量中有8个元素,每个元素都用int8_t表示。

\n

在 x86_64 中实现一个算法,将两个向量(uint64_t 类型)相加。

\n

添加元素时应考虑饱和算术。

\n

例如:

\n

80 + 60 = 127

\n

(\xe2\x88\x9240) + (\xe2\x88\x92100) = \xe2\x88\x92128

\n
\n

最大的挑战是施加的限制:

\n
    \n
  • 除ret外无条件指令;没有跳跃、cmove、set 等。
  • \n
  • 该解不能长于 48 条指令(存在短于 37 条指令的解)
  • \n
\n

我想不出任何符合这些限制的解决方案。\n有人能给我一些提示吗?欢迎使用 C 语言的示例。

\n

我只能使用“标准”、传输、算术、逻辑指令和标准寄存器:

\n
    \n
  • mov cbw/cwde/cdqe cwd/cdq/cqo movzx movsx
  • \n
  • 添加 sub imul mul idiv div inc dec neg
  • \n
  • 和或异或非 sar sarx shr shrx shl shlx ror rol
  • \n
  • 雷雷
  • \n
\n

assembly bit-manipulation x86-64 saturation-arithmetic swar

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