我正在尝试在Linux(x86)上学习GCC内联汇编,我的第一个实验是尝试实现乘法的整数溢出检测.这似乎很容易,但它有副作用,我不明白.
所以,在这里我想要将两个无符号8位整数相乘,并查看结果是否溢出.基本上我只是将第一个操作数加载到AL寄存器中,将另一个操作数加载到BL寄存器中,然后使用该mul指令.结果存储为AX寄存器中的16位值.所以我然后将AX寄存器中的值复制到我的C变量b,除非它溢出.如果它溢出我设置c为1.
uint8_t a = 10;
uint8_t b = 25;
uint8_t c = 0; // carry flag
__asm__
(
"clc;" // Clear carry flag
"movb %3, %%al;" // Load b into %al
"movb %2, %%bl;" // Load a into %bl
"mul %%bl;" // Multiply a * b (result is stored in %ax)
"movw %%ax, %0;" // Load result into b
"jnc out;" // Jump to 'out' if the carry flag is not set
"movb …Run Code Online (Sandbox Code Playgroud)