我有一个简单的高级装配程序,我正在学习位移和旋转的细节.我有这个简单的程序可以在一个字节中移位.
static
var: int8 := 127;
begin test1;
stdout.put(var, nl);
shl(1, var);
stdout.put(var, nl);
if (@C) then stdout.put("carry set"); endif;
end test1;
Run Code Online (Sandbox Code Playgroud)
当字节设置为127时,它应该是01111111.
当然,通过向左移动一次,应该提高进位标志,因为最后一位保留用于签名?
然而,这似乎不会发生,实际上所有字节都向左移动一次,因此字节现在是11111110或-2.
如果每次都发生这种情况,那么什么条件会导致进位标志被设置?
平台赢得7 64位
正如其他人已经指出的那样,您需要将127移位2个位置才能实际设置进位标志.但是你说它仍然不起作用; 这是我最好的猜测为什么:
我不熟悉HLA及其库函数,但是,作为编写程序集的一般规则,您应该始终假设调用库函数可能会以任意方式更改标志,除非有一些文档另有说明.许多指令可以更改标志,因此除非库函数明确保存条目上的标志并在退出时恢复它们(例如通过使用pushf
和popf
指令将它们保存在堆栈中),它们可能最终处于任何状态.
在您的代码中,您可以在进位标志的测试和测试stdout.put
之间调用库例程shl
:
shl(2, var); /* I'm assuming you've already changed 1 to 2 here */
stdout.put(var, nl);
if (@C) then stdout.put("carry set"); endif;
Run Code Online (Sandbox Code Playgroud)
我猜这stdout.put
是清除旗帜.
因此,请在班次后立即进行测试:
shl(2, var);
if (@C) then stdout.put("carry set", nl); endif;
stdout.put(var, nl);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1817 次 |
最近记录: |