Gov*_*mar 3 c x86 inline-assembly carryflag
我在C中有以下方法,它采用两个16位短整数和:
返回结果:
short __declspec(naked) getchecksum(short s1, short s2)
{
__asm
{
mov ax, word ptr [esp+4]
mov bx, word ptr [esp+8]
add ax, bx
jnc skip_add
add ax, 1
skip_add:
not ax
ret
}
}
Run Code Online (Sandbox Code Playgroud)我不得不在内联汇编中写这个,因为我不知道如何在不使用汇编程序的情况下测试进位标志.有谁知道这样做的方法?
不(C根本没有标志的概念),但这并不意味着你不能得到相同的结果.如果使用32位整数进行加法,则第17位是进位.所以你可以像这样写:
uint16_t getchecksum(uint16_t s1, uint16_t s2)
{
uint32_t u1 = s1, u2 = s2;
uint32_t sum = u1 + u2;
sum += sum >> 16;
return ~sum;
}
Run Code Online (Sandbox Code Playgroud)
我已将这些类型设为无符号以防止出现问题.在您的平台上可能没有必要这样做.