我正在使用 emu8086 学习 8086 汇编,我正在玩一些旋转指令,至于我的问题,我知道对于超过 1 位移位/旋转,溢出标志 OF 的行为是未定义的。
但是当我尝试下面的代码时
MOV BH,72H
MOV CL,4
ROL BH,CL
Run Code Online (Sandbox Code Playgroud)
BH 寄存器中的结果为 27H,并且至于标志,进位和溢出标志被设置为 1,即使 OF 不应该被设置,因为它是未定义的。
有人可以解释一下 OF 是如何以及为什么设置在这里的吗?
所以我在汇编中有以下代码:
我知道该函数的参数有两个(x 和 y 或任何字母)。问题是我不知道如何从汇编代码中查看该函数是否返回任何内容,因为它只说ret. 这个函数会被视为 void 或 int 吗?任何有助于理解的解释将不胜感激。
我有一个 float32 数字向量。对于每个元素,我必须找到 cos,sin
我想使用查找表而不是默认库。是否有 ARM 内部代码可以用于此目的?
我对编译器 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 的最佳方法应该是什么?非常感谢您的帮助。
我正在寻找一些示例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) 我有一个问题需要解决,但我不知道如何解决。我正在询问如何解决这个问题的一般想法。我有一个内存地址,在 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 位?
汇编代码和机器代码是由架构指定的吗?我知道你如何实现架构对你来说是不重要的(微架构可以实现架构)。但我不明白汇编或机器代码是否是由架构指定的?
assembly instruction-set cpu-architecture machine-code micro-architecture
我想从程序集中调用类似 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 实现的程序集?
非常感谢任何信息或想法。
所以我阅读了英特尔关于 _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 做什么)?
我最近面临一个给定的问题:
\n\n\n向量中有8个元素,每个元素都用int8_t表示。
\n在 x86_64 中实现一个算法,将两个向量(uint64_t 类型)相加。
\n添加元素时应考虑饱和算术。
\n例如:
\n80 + 60 = 127
\n(\xe2\x88\x9240) + (\xe2\x88\x92100) = \xe2\x88\x92128
\n
最大的挑战是施加的限制:
\n我想不出任何符合这些限制的解决方案。\n有人能给我一些提示吗?欢迎使用 C 语言的示例。
\n我只能使用“标准”、传输、算术、逻辑指令和标准寄存器:
\nassembly ×7
c++ ×2
intrinsics ×2
simd ×2
x86 ×2
x86-64 ×2
apple-m1 ×1
arm ×1
arm64 ×1
att ×1
avx ×1
avx2 ×1
bit-fields ×1
eflags ×1
emu8086 ×1
machine-code ×1
macos ×1
masm ×1
neon ×1
sse ×1
swar ×1
system-calls ×1
visual-c++ ×1