Arduino内联ASM不按预期工作
Arduino inline ASM not working as expected
我正在尝试构建一个时钟,所以我正在使用ASM和arduino。对于大多数部分,纯C就可以了,但是为了准备输出到BCD到Decimal转换器的时间,我决定使用ASM。我用8086 c++/ASM编写了以下代码,它在我的计算机上运行良好:
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
for(int num = 0; num < 16; num++) {
int bin[4];
bin[0] = bin[1] = bin[2] = bin[3] = 0;
asm("movl %%ebx, %%eax;"
"andl $8, %%eax;"
"cmp $0, %%eax;"
"je a;"
"movl $1, %0;"
"jmp b;"
"a: movl $0, %0;"
"b: movl %%ebx, %%eax;"
"andl $4, %%eax;"
"cmp $0, %%eax;"
"je c;"
"movl $1, %1;"
"jmp d;"
"c: movl $0, %1;"
"d: movl %%ebx, %%eax;"
"andl $2, %%eax;"
"cmp $0, %%eax;"
"je e;"
"movl $1, %2;"
"jmp f;"
"e: movl $0, %2;"
"f: movl %%ebx, %%eax;"
"andl $1, %%eax;"
"cmp $0, %%eax;"
"je g;"
"movl $1, %3;"
"jmp h;"
"g: movl $0, %3;"
"h: nop"
: "=r" (bin[0]), "=r" (bin[1]), "=r" (bin[2]), "=b" (bin[3])
: "b" (num)
: "%eax"
);
cout << num << ": ";
for(int i = 0; i < 4; i++) {
cout << bin[i];
}
cout << endl;
}
return 0;
}
然而,当我修改它在Arduino上运行时,事情完全停止工作:
for(uint8_t num = 0; num < 16; num++) {
uint8_t bin[4];
bin[0] = bin[1] = bin[2] = bin[3] = 0;
asm("mov __tmp_reg__, %[val];"
"and __tmp_reg__, $8;"
"cmp __tmp_reg__, $0;"
"je a;"
"mov %[bit8], $1;"
"rjmp b;"
"a: mov $0, %[bit8];"
"b: mov %[val], __tmp_reg__;"
"and __tmp_reg__, $4;"
"cmp __tmp_reg__, $0;"
"je c;"
"mov %[bit4], $1;"
"rjmp d;"
"c: mov $0, %[bit4];"
"d: mov %[val], __tmp_reg__;"
"and __tmp_reg__, $2;"
"cmp __tmp_reg__, $0;"
"je e;"
"mov %[bit2], $1;"
"rjmp f;"
"e: mov $0, %[bit2];"
"f: mov %[val], __tmp_reg__;"
"and __tmp_reg__, $1;"
"cmp __tmp_reg__, $0;"
"je g;"
"mov %[bit1], $1;"
"rjmp h;"
"g: mov $0, %[bit1];"
"h: nop"
: [bit8] "=r" (bin[0]), [bit4] "=r" (bin[1]), [bit2] "=r" (bin[2]), [bit1] "=r" (bin[3])
: [val] "r" (num)
: "r0"
);
8086代码给出您期望的输出:
0: 00001: 0001年
2: 0010年
3: 0011
…13: 1101
14: 1110
15:11 11
但是在Arduino上运行的代码给出了不同的输出:
0: 50001: 0000年
2: 0000年
3: 0000
…(零继续)
13: 0000
14: 0000
15: 0000
你可以想象,如果代码返回…五个我不知道它怎么能返回5当源中没有任何东西接近5的时候。我不知道该怎么办,所以我真的需要一些帮助。
我正在使用Arduino Leonardo,它有一个ATMega32U处理器。我试过反汇编由Arduino软件生成的可执行文件(它用AVR-GCC编译它),但我似乎无法在我的努力中找到我输入的代码。
感谢您的时间,堆栈溢出
您可以轻松地用c++编写代码,如下所示:
int bin[4] = {};
bin[0] = !!(num & 8);
bin[1] = !!(num & 4);
bin[2] = !!(num & 2);
bin[3] = !!(num & 1);
或:
int bin[4];
int bit = 8;
for(int i = 0; i < 4; i++)
{
bin[i] = !!(num & bit);
bit >>= 1;
}
如果您不喜欢!!
(它使"取下一个值并使其为0[如果它为假]或1[如果它为真]),您可以将其替换为:
for(int i = 0; i < 4; i++)
{
bin[i] = (num >> 3 - i) & 1;
}
我认为你故意想要最低bin
索引中的最高位,而不是通常情况下最高索引中的最高位。
相关文章:
- 内联映射初始化的动态atexit析构函数崩溃
- 不同翻译单元中不可重载的非内联函数定义
- 头文件、宏和内联函数c++
- 内联函数中具有内部链接的全局变量
- 内联程序集printf将整数解释为地址
- 内联如何影响模块接口中的成员函数
- 检测 COFF 对象文件中C++内联符号
- 在C++中使用内联方法时出现未定义的符号错误
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 内联变量如何工作
- 内联函数在C++中是如何工作的
- 为什么我的内联汇编程序不能按预期工作
- 代码内联工作,但在类中
- Arduino内联ASM不按预期工作
- 为什么此内联程序集中的错误操作无法正常工作
- g++内联asm在使用优化标志时未按预期工作
- C++内联转换和转换为变量的工作方式不同
- 内联变量是如何工作的