此循环在英特尔Conroe/Merom上每3个周期运行一次,imul按预期方式在吞吐量方面存在瓶颈.但是在Haswell/Skylake上,它每11个循环运行一次,显然是因为setnz al它依赖于最后一个循环imul.
; synthetic micro-benchmark to test partial-register renaming
mov ecx, 1000000000
.loop: ; do{
imul eax, eax ; a dep chain with high latency but also high throughput
imul eax, eax
imul eax, eax
dec ecx ; set ZF, independent of old ZF. (Use sub ecx,1 on Silvermont/KNL or P4)
setnz al ; ****** Does this depend on RAX as well as ZF?
movzx eax, al
jnz .loop ; }while(ecx);
Run Code Online (Sandbox Code Playgroud)
如果setnz al …
在这里,我试图将变量X(这是一个8位变量)移动到寄存器bx(这是一个16位寄存器).在这种情况下,如何将X的值移动到寄存器bx中?
.686p
.model flat,stdcall
.stack 2048
.data
X byte 5
ExitProcess proto, exitcode:dword
.code
start:
invoke ExitProcess, 0
mov bx, X; 1>p4.asm(13): error A2022: instruction operands must be the same size
end start ;what does the end statement do?
Run Code Online (Sandbox Code Playgroud) 我对程序集完全陌生,在搜索之后我仍然对寄存器有一些疑问。目前我正在尝试通过执行以下操作一遍又一遍地划分值:
1.将 ax 与 bl 相除(似乎余数去 ah,商去 al)
2.move al(quotient) to ax
3. 如果 ax 小于或等于 0,则跳转到 5
4.跳到1
5.结束
问题出现在指令 2 上,因为我试图将 8 位值移动到 16 位值。有人知道如何解决问题吗?
我使用的是 emu8086,所以寄存器只有 x、h 和 l。