小编old*_*mer的帖子

在减法中携带旗帜

我正在使用MASM32.

使用此代码:

mov eax,5
sub eax,10
Run Code Online (Sandbox Code Playgroud)

将设置CF状态标志.但是使用我的铅笔和纸,我实际上发现MSB没有携带任何东西.是的,我知道从减去数量较少的数字集CF减去.但我想知道为什么?

因为使用此代码:

mov eax,5
mov ebx,10
not ebx
add ebx,1
add eax,ebx
Run Code Online (Sandbox Code Playgroud)

CF标志永远不会被设置.

x86 assembly masm status carryflag

5
推荐指数
1
解决办法
5991
查看次数

嵌入式C中的"预期声明"错误

我收到的错误就像是"预期的声明"

我的代码如下

#define IN_Tamper    0X00001000     /*P2.12 = EINT2*/
#define DIR_IN_Tamper    { FIO2DIR &= ~0X00001000 ; } 

/* main */
DIR_IN_Tamper(); 
if(((IN_Tamper >> 12) & 0x01) == 1)
            BUZZER_ON();
         else
            BUZZER_OFF();   
Run Code Online (Sandbox Code Playgroud)

我收到错误说

  1. 预期DIR_IN_Tamper()的声明;

  2. 期待对其他部分的陈述.....

c arm keil arm7

5
推荐指数
1
解决办法
2329
查看次数

llvm使用库函数进行优化

从这样的代码开始

void lib_memset( unsigned char *dest, unsigned char c, unsigned int n)
{
    while(n--)
    {
        *dest=c;
        dest++;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用llvm作为交叉编译器

clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi  -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls  lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls  lib_memset.bc -o lib_memset.s
Run Code Online (Sandbox Code Playgroud)

当使用优化器时,它会检测并用真实的memset替换它

lib_memset:
    push    {r11, lr}
    mov r3, r1
    mov r11, sp
    cmp r2, #0
    beq .LBB0_2
    mov r1, r2
    mov r2, r3
    bl  __aeabi_memset
.LBB0_2:                                @ %while.end …
Run Code Online (Sandbox Code Playgroud)

embedded optimization assembly arm bare-metal

5
推荐指数
1
解决办法
851
查看次数

Z80汇编:如何将带符号的8位值添加到16位寄存器?

我写了一个Z80反汇编程序,它从我的SBC中的ROM运行.我需要做的最后一件事(暂时尚未发现的bug)是转换相对地址并将它们作为绝对地址输出,这样当反汇编程序遇到五个JR操作码变体之一时,它会显示绝对地址JR操作码指向.

JR操作码变体使用8位偏移值来告诉Z80跳转到内存的哪个位置.偏移量是单个有符号(-128 < - > 127)字节,我需要将其添加到HL寄存器中的当前存储器位置以获得绝对地址.

我的大脑似乎正在遭受严重的语法错误,甚至可能被零除,因为我不能为我的生活找出如何将一个8位带符号(或2的补码)字节添加到16位注册以获取绝对地址.已经搜索了互联网,没有答案即将到来.

任何人都可以提出解决方案或指出我正确的方向吗?

math assembly z80

5
推荐指数
1
解决办法
433
查看次数

gdb中nexti和stepi有什么区别?

使用gdb调试可执行文件时,有两个命令可用于逐步执行:

  • stepi
  • nexti

两者之间的区别是什么?为什么有人会选择一个?

在gdb中使用帮助说:

stepi:准确地执行一条指令。

nexti:第一步,但继续进行子例程调用。

因为我们在这里处理指令和机器代码(正在执行的程序的最小部分),所以我无法弄清楚子例程的调用是什么。

c c++ debugging gdb

5
推荐指数
2
解决办法
2353
查看次数

ARMv7 Word补丁(CBNZ)

我有一个我正在拆卸的iPhone应用程序.

据我所知,CBNZ指令是"比较并在非零上分支".和CBZ是"比较和分支零"

我无法在网上找到任何地方来确认这一点,但对我而言,似乎CBNZ由B9代表地址如此"0x B9 DC"而CBZ是"0x B3 DC".

完整地址为:DC B9 53 48 03 99 78 44 00 68 BF F1 74 EE 51 49

我将其修改为:DC B3 53 48 03 99 78 44 00 68 BF F1 74 EE 51 49

以前我在ARMv6中修补了相同的检查,虽然它由BNE"0x D1 30"表示,我修补了B"0x E0 32"

这:32 D1 5B 48 5C 49 78 44 79 44 00 68 09 68 AC F1

至:32 E0 5B 48 5C 49 78 44 79 44 00 68 09 68 AC F1

这完全符合我的预期,采取分支并继续我想要的.通常情况下,如果通过检查,它只需要这样的分支.

我认为将CBNZ修补到CBZ会有类似的结果,虽然看起来不是.

希望有人能帮助我理解.对不起,如果这不是一个论坛,我应该发布这样的问题虽然它似乎是一个好地方问.如果您需要更多信息,我将很乐意提供.

arm

4
推荐指数
1
解决办法
3735
查看次数

UART代码端口后的TI MSP430中断问题

我将MSP430F2013处理器用于没有UART的应用程序.我需要一个UART,因此我使用TI的示例代码"msp430x20x3_ta_uart2400.c"来模拟使用定时器模块.这一切都运行良好(使用IAR Embedded Workbench编译),使用PuTTY测试它以将字符传输到开发板,并使用环回将它们回显到终端.

这是一个降低风险的练习,现在我已将该代码移植到我的应用程序的状态机中.完成此操作后,我遇到了有关定时器中断和低功耗睡眠模式的问题.这是我进入低功耗(睡眠)模式的代码片段:

// Prepare the UART to receive one byte.
prepare_receiver();

// Enter low power mode 1.
__bis_SR_register(LPM1_bits + GIE);

// Check whether the full message has been received.
if(true == get_message_complete())
{
    process_event(e_euart_message_received, NULL);
}
Run Code Online (Sandbox Code Playgroud)

我在调试器(C-Spy)上看到的是,有时它会bis_SR_register()在第一个条目上执行该行,然后转到if语句,即忽略我要求它进入睡眠状态的事实.在其他情况下,当它确实进入睡眠状态时,ISR会正确触发并最终将我带回if语句以继续执行程序(正如我所料).但是,如果我尝试跳到下一个语句,应用程序会冻结第一行,即我无法前进.

我想不出任何功能上与我正在做的TI示例有什么不同,所以我认为我的问题必须与我如何移植它有关.例如,我的Timer ISR和我在这里发布的代码是在不同的编译单元 - 这种决定会对事情有什么影响吗?我知道我的问题可能有点模糊,但不幸的是我无法发布我的所有代码,所以相反,我正在寻找有MSP经验的人,他可能会提出一些建议,或者一些潜在的陷阱,我可能已陷入其中.

embedded debugging interrupt msp430 iar

4
推荐指数
1
解决办法
3104
查看次数

PE 最多可以有多少个部分?

我正在用 C# 编写一个程序,在其中读取 PE 的字节。但为了获得 RVA,我需要使用节标题。我想知道节标题的最大数量是多少?

我尝试过谷歌,我也看过这里,但我没有找到任何可以指引我正确方向的东西

谢谢。

byte header portable-executable sections

4
推荐指数
1
解决办法
2483
查看次数

"+&r"与"+ r"有什么不同?

GCC的内联汇编程序识别声明符=r=&r.这些对我来说很有意义:=r让汇编器重用输入寄存器来输出.

但是,GCC的内联汇编程序也承认声明者+r+&r.这些对我来说不太合理.毕竟,是不是区别+r+&r区别没有区别?是否+r仅仅告诉编译器保留一个仅用于单个变量的寄存器是不够的?

例如,以下GCC代码有什么问题?

#include <stdio.h>
int main()
{
    int a = 0;
    printf("Initially, a == %d.\n", a);
    /* The architecture is amd64/x86-64. */
    asm(
        "inc %[a]\n"
        : [a] "+r" (a)
        : : "cc"
    );
    printf("However, after incrementation, a == %d.\n", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

顺便提一下,我的内联汇编缺少输入声明,因为在我的(可能是错误的)头脑中,+r封面输入,破坏,输出,一切.我有什么误会,拜托?

背景

我已经在汇编中编写了8位和16位微控制器,但在托管环境中编码汇编方面几乎没有经验.

c x86 gcc inline-assembly

4
推荐指数
1
解决办法
232
查看次数

如何在手臂内联汇编中访问局部C变量?

我想访问在内联手臂汇编中用C声明的局部变量。我怎么做?

可以这样访问全局变量,

int temp = 0;
Function(){
    __asm(
       ".global temp\n\t"           
        "LDR R2, =temp\n\t"                                                     
        "LDR R2, [R2, #0]\n\t"
    );
}       
Run Code Online (Sandbox Code Playgroud)

但是,如何访问局部变量?我尝试将局部变量的“ .global”更改为“ .local”,但是会产生错误(未定义对“ temp”的引用)。我正在使用的IDE是KEIL。

有什么想法吗?提前致谢。

c arm inline-assembly keil

4
推荐指数
1
解决办法
3223
查看次数