我想要一個void函式來列印是否發生進位(溢位)并列印(可能溢位)加法的值。
這是我的嘗試,但它確實想要編譯:
#include <stdio.h>
typedef unsigned long ulong;
void
func()
{
ulong a = 3;
ulong b = 1;
ulong c;
__asm__(
"\taddq\t%2, %q0\n" /* Add b to a and store in c */
"\tjc\tcarry"
: "=r" (c) /* Outputs */
: "0" (a), "rme" (b) /* Inputs */
);
printf("no carry\nc = %lu\n", c);
return;
__asm__("carry:");
printf("carry\nc = %lu\n", c);
return;
}
int
main()
{
func();
}
但是,當我洗掉第一個return陳述句時它會運行,但是如果沒有發生進位,它會列印兩次。
如何使用兩個 return 陳述句來做到這一點?
uj5u.com熱心網友回復:
你需要使用asm goto它。為此,添加gotoafter __asm__,將您的標簽更改為 C 標簽,將標簽傳遞到 clobbers 之后,然后使用 a%l來參考它。這是應用了這些修復程式的程式:
#include <stdio.h>
typedef unsigned long ulong;
void
func()
{
ulong a = 3;
ulong b = 1;
ulong c;
__asm__ goto(
"\taddq\t%2, %q0\n" /* Add b to a and store in c */
"\tjc\t%l[carry]"
: "=r" (c) /* Outputs */
: "0" (a), "rme" (b) /* Inputs */
:
: carry
);
printf("no carry\nc = %lu\n", c);
return;
carry:
printf("carry\nc = %lu\n", c);
return;
}
int
main()
{
func();
}
盡管正如評論中提到的那樣,特別是對于這個用例,您應該__builtin_uaddl_overflow改用它,除非您的目標只是學習如何跳出行內匯編。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424439.html
下一篇:[bx]的尋址模式型別?
