- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我试图转换为 gcc 样式 asm 内联汇编代码的实际代码。
#include<iostream>
using namespace std;
int reverse(int num);
int main(){
int num;
cout << "enter number: ";
cin >> num;
cout << endl;
cout << reverse(num);
return 0;
}
int reverse(int num){
if(num == 0 || num == 1){
return num;
}
__asm
{
xor eax, eax
xor ecx, ecx
mov ebx, num
clc ; clear carry
not_found:
inc ecx
shl ebx, 1
jnc not_found
rcr eax, 1
mov edx, ecx
again:
shl ebx, 1
rcr eax, 1
inc ecx
cmp ecx, 32
jne again
dec edx
again2:
shr eax, 1
dec edx
cmp edx, 0
jne again2
}
}
因为我无法用 gcc 编译上面的代码,我尝试将它转换成可以被 gcc 编译器成功编译的东西,但到目前为止我无法产生任何有意义的结果。
最佳答案
根据OP评论中的代码,这里是一个使用内联汇编移动一位的修改示例:
#include<iostream>
using namespace std;
int reverse(int num);
int main()
{
int num;
cout << "enter number: ";
cin >> num;
cout << endl;
cout << reverse(num) << endl;
return 0;
}
int reverse(int num)
{
if (num == 0 || num == 1)
{
return num;
}
int temp = 0;
asm( "shll $1, %0 \n\t" : "=r"(temp) : "0"(num));
return temp;
}
请注意,如果您使用 r
约束要求操作数,则 gcc
会将操作数放入寄存器中,因此真的没有理由自己移动
它们(至少在这个小样本中)。此外,我在输入约束中使用了 0
来表示它应该与输出相同的寄存器,因为这就是 shl
的工作方式。
仍然不确定 num == 1
条件,但大概是因为我们不知道完整函数的实际功能。
关于c++ - 使用 gcc 编译内联汇编时出错, "shl",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14161342/
在mutagen ,我使用特化来变异可能的二进制操作。基本上,我替换了 a + b和 ::mutagen::AddSub::add(a, b, mutation_count) las,它在场时失败了移
我需要将 EAX 乘以 37,我知道我可以使用 shl eax,5 和 shl register,2 然后将寄存器添加到 eax 来乘以 38,但我不确定乘以奇数的代码,我只能使用 shl add 和
我正在尝试将shl应用于Kotlin中的Int值: val a = 1092455 println(a.toString()) println(toString(bits(one))) println
请考虑以下英特尔8086汇编程序: CX保持非零值。 L: ADD AX, AX ADC DX, 0 LOOP L 我被要求理解上面的代码并重写它以提高效率。 据我了解: 它将2 ^ CX
这是我试图转换为 gcc 样式 asm 内联汇编代码的实际代码。 #include using namespace std; int reverse(int num); int main(){
这个问题的灵感来自于我尝试回答另一个问题:Converting decimal/integer to binary - how and why it works the way it does? 唯一
我们的老师在类里面给我们布置了一项作业。问题是我们在类里面没有讨论位移位,所以我有点不知道如何做到这一点。在作业说明中,他告诉我们以下内容: 我们只能使用 mov、add 、sub 指令来完成赋值。
我在 Assembly x86 类的代码中遇到这个编译错误, A2070: invalid instruction operands 这条线是 shl eax, ecx ecx 应该是循环的(减 1)
我正在基于 Delphi(转换代码)在 C# 中创建一个应用程序,但我发现了一个我不认识的命令 (shl),我想知道是否有与 C# 等效的命令。 提前致谢。 最佳答案 Shl是left shift .
声明... const n = 2 shl 33 会将常量n设置为值4,而不会出现任何编译器投诉! 还有... Caption := IntToStr(2 shl 33); ...返回 4 而不是
Result:= b8; Result:= Result+ (b7 SHL 8); Result:= Result+ (b6 SHL 16); Result:= Result+ (b5
这个问题是关于我们如何将一个整数与一个常数相乘。那么让我们看一个简单的函数: int f(int x) { return 10*x; } 如何才能最好地优化该函数,尤其是在内联到调用方时? 方
在/O2(发行版)模式下查看Visual Studio(2015U2)生成的程序集时,我看到此“手动优化”的C代码片段已转换回乘法: int64_t calc(int64_t a) { retur
我正在学习汇编语言,我已经开始使用宏来缩短我的程序。其中一个宏未按预期工作。 这是我正在尝试运行的基本程序, include pcmac.inc .model small .stack 100h .d
您为什么要使用: MOV EAX, 22 SHL EAX, 2 ...乘以 4 时而不是仅使用 MUL 指令? 据我所知,这也可以使用 SHR 而不是 DIV 来完成。 这样做有什么好处? 另外,你可
我不明白问题出在哪里,因为结果是正确的,但其中有问题,我不明白。 1.这是我必须转换为 C 的 x86 代码: %include "io.inc" SECTION .data mask DD
我要将以下 AT&T x86 程序集转换为 C: movl 8(%ebp), %edx movl $0, %eax movl $0, %ecx jmp .L2 .L1 shll $
我是一名优秀的程序员,十分优秀!