我目前尝试在以下汇编代码的上下文中理解bool validInput = false;
PromptResult pResult;
PromptConfig pConfig = new PromptConfig
{
Message = "Some message",
MaxLength = 10,
Placeholder = "Number...",
OnTextChanged = args =>
{
if (args.Value.Length < 1)
args.IsValid = false;
foreach (char c in args.Value)
{
if (!char.IsNumber(c))
{
args.IsValid = false;
break;
}
}
}
};
pResult = await UserDialogs.Instance.PromptAsync(pConfig);
if(pResult.Ok)
{
validInput = true;
}
if (validInput)
{
Navigation.PushAsync(new MenuPage()));
}
操作:
DIV
我们必须计算返回值。将使用以下值调用该函数:
在我看来,1)和2)的结果是0和8。
现在我想计算3)和4)的结果。我知道push ebp
mov ebp, esp
mov eax [ebp+0x8]
mov edx, 0x0
div [ebp+0xC]
mov esp, ebp
pop ebp
ret
操作使用无符号整数,我的第一个问题是,如何呈现-3和-1?
我将按以下步骤进行:
关于第三种情况:
-3有两个赞美:11111101
所以
div:(24)0001100/11111101
结果会是什么?
第四个:
-1:11111111
所以
div:( - 1)11111111/10
div = 2 = shr 1 - &gt; 1111111 - &gt; 127
你能帮我验证一下结果吗?
答案 0 :(得分:2)
eax
是32位寄存器
这意味着div将处理32位操作数,而不是像你想象的那样的字节值
-3 in 2的补码是FFFFFFFD
十六进制= 4294967293
十进制。
-1的补码是FFFFFFFF
,十六进制为4294967295
,十进制。
您可以使用任何计算器轻松执行计算。 如果要除以字节值,则应使用
push ebp
mov ebp, esp
xor eax,eax ;mov eax,0
mov al, [ebp+0x8]
div al, byte ptr [ebp+0xC]
xor edx,edx
mov dl,ah ;put the remainder in edx
xor ah,ah
mov esp, ebp
pop ebp
ret
部分
xor edx,edx
mov dl,ah ;remainder in edx
xor ah,ah
可以简化为
movzx edx,ah ;mov byte value with zero extend to full reg
xor ah,ah
结果将存储在al
中,其余部分存储在ah
中
由于英特尔使用的是小端,因此只使用一个字节并不重要,mov al,[some_address_as_before]
仍可正常工作。
在大端架构上,您需要将地址调整3个字节。
如果要清除寄存器,通常最好使用xor a,a
而不是使用mov reg,0
,前者编码的字节数更少,运行速度更快。