为什么没有设置进位标志?

Jas*_*ill 0 x86 assembly

我有一个简单的高级装配程序,我正在学习位移和旋转的细节.我有这个简单的程序可以在一个字节中移位.

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位

Mat*_*ery 8

正如其他人已经指出的那样,您需要将127移位2个位置才能实际设置进位标志.但是你说它仍然不起作用; 这是我最好的猜测为什么:

我不熟悉HLA及其库函数,但是,作为编写程序集的一般规则,您应该始终假设调用库函数可能会以任意方式更改标志,除非有一些文档另有说明.许多指令可以更改标志,因此除非库函数明确保存条目上的标志并在退出时恢复它们(例如通过使用pushfpopf指令将它们保存在堆栈中),它们可能最终处于任何状态.

在您的代码中,您可以在进位标志的测试和测试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)