小编RTC*_*222的帖子

如何将零标志移动到 x86-64 中的寄存器中?

我想将比较结果设置的零标志(例如“cmp rax,rbx”)移动到寄存器中。我知道我可以使用 PUSHF/PUSHFD/PUSHFQ 之一将标志推入堆栈,但现在我只想将零标志从堆栈移动到寄存器。

根据https://www.felixcloutier.com/x86/pushf:pushfd:pushfq,它“将堆栈指针减 4(如果当前操作数大小属性为 32)并将 EFLAGS 寄存器的全部内容推送到堆。” 但这并没有告诉我它们被推送的顺序以及如何访问零标志。

根据英特尔软件开发人员手册(2023 年 6 月)第 7.3.13.2 节,零标志是从零开始的 #6。(还有维基百科)。因此我猜这样就mov al,[rsp+6]可以了。但我需要确定,因为它们都只是布尔值——我可能会获取错误的布尔值。

我处于 64 位模式,因此我将寻址 RFLAGS 寄存器。手册第 7.3.1.4 节说:“PUSHF 和 POPF 在 64 位模式下的行为与非 64 位模式下的行为相同。PUSHFD 始终将 64 位 RFLAGS 压入堆栈(RF 和 VM 标志读为清除) )。POPFD 总是从堆栈顶部弹出一个 64 位值,并将低 32 位加载到 RFLAGS。然后将 RFLAGS 的高位进行零扩展。

最后,PUSHFD 和 PUSHFQ 有什么区别?双字和四字,但在 64 位模式下应该使用哪个?

assembly x86-64 nasm eflags

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

将浮动从高xmm四字移动到低xmm四字

MOVHPD将xmm寄存器的高位四字提取到内存中。

PEXTRQ提取xmm寄存器的高位四字并将其放入整数寄存器(仅整数)。

SHUFPD随机播放。

VPSLLDQ使高位四字清零。

是否有指令将浮点值从xmm寄存器的高位四字移动到同一xmm寄存器或另一个xmm寄存器的低位四字?还是我总是必须经过内存(添加额外的周期)?

更新:根据以下@fuz和@Peter Cordes的评论,这是我所做的。这将分别为xmm0的上下四位数调用舍入函数;由于特殊的舍入参数,必须为每个qword分别调用该函数,因此它不能是SIMD指令。目标是将xmm0中的每个qword取整并将结果放入xmm11中。

movapd xmm2,xmm0 ;preserve both qwords of xmm0
call Round
movsd [scratch_register+0],xmm0 ; write low qword to memory
movhlps xmm0,xmm2
call Round
movsd [scratch_register+8],xmm0 ; write low qword to memory
movupd xmm11,[scratch_register]
Run Code Online (Sandbox Code Playgroud)

更新#2:@Peter Cordes显示了如何在没有内存的情况下执行此操作:

movhlps  xmm2, xmm0   ; extract high qword for later
call Round            ; round the low qword
movaps   xmm3, xmm0   ; save the result
movaps   xmm0, xmm2   ; set up the arg
call Round            ; round the high qword
movlhps  xmm3, …
Run Code Online (Sandbox Code Playgroud)

assembly sse x86-64 nasm avx

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

如何在 Python 中编写整数,而不是整数字符串

我需要创建 10,000 个随机整数的文件进行测试。我将在 Python 和 C 中使用该文件,因此我不能将数据表示为字符串,因为我不希望在 C 中产生整数转换的额外开销。

在 Python 中,我可以使用该方法struct.unpack将文件转换为整数,但无法使用该write()方法将其写入文件以在 C 中使用。

Python 有没有办法只将整数而不是整数作为字符串写入文件?我使用过print(val, file=f)and f.write(str(val)),但在这两种情况下它都会写入一个字符串。

这是我现在所在的位置:

file_root = "[ file root ]"

file_name = file_root + "Random_int64"

if os.path.exists(file_name):
    f = open(file_name, "wb")
    f.seek(0)

for _ in range(10000):
    val = random.randint(0, 10000)
    f.write(bytes(val))

f.close()
f = open(file_name, "rb")

wholefile = f.read()
struct.unpack(wholefile, I)
Run Code Online (Sandbox Code Playgroud)

我的unpack格式字符串错误,所以我现在正在处理。我对此不太熟悉struct.unpack

python python-3.x

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

无法将 int64_to 转换为 const void ptr

我使用 C 程序来调用 NASM 程序。返回时,NASM 将指向数组缓冲区的指针传递回 C。我想使用 fwrite 将该数组缓冲区写入文件。为此,我需要将 NASM 返回的 int64_t 转换为 const void *ptr 以进行 fwrite。这是我到目前为止所尝试过的:

const void *output_ptr = rp;
const void *output_ptr = *(const void)rp;
const void *output_ptr = *(const void *ptr)rp;
*output_ptr = *(const void *ptr)rp;
Run Code Online (Sandbox Code Playgroud)

但这些都不起作用。这看起来应该是一个简单的问题,但在互联网和 Stack Overflow 上搜索并没有找到任何答案。

这是文件写入代码:

FILE *fp = fopen (output_file.bin, "wb");
if (fp == NULL  )
    return -1;
fwrite (output_ptr, 8, length, fp);
fclose (fp);
Run Code Online (Sandbox Code Playgroud)

感谢您对此的任何帮助。

c

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

标签 统计

assembly ×2

nasm ×2

x86-64 ×2

avx ×1

c ×1

eflags ×1

python ×1

python-3.x ×1

sse ×1