我想将比较结果设置的零标志(例如“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 位模式下应该使用哪个?
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) 我需要创建 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
。
我使用 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)
感谢您对此的任何帮助。