【问题标题】:MVN with rotate arm instruction带有旋转臂指令的 MVN
【发布时间】:2016-04-29 10:32:27
【问题描述】:

这是一个考试中出现的问题,但我无法理解它的解决方案。

ARM 指令是 MVN R7, #0x8C, 4,我必须找到存储在 R7 中的值。

解决方法如下:

= 0x8C ROR 4

= (0000 0000 0000 0000 0000 0000 1000 1100)2 ROR 4

= (1100 0000 0000 0000 0000 0000 0000 1000)2

= 0xC0000008

这对我来说看起来不正确,因为 MVN 涉及取补,并且上述步骤看起来像一个简单的 MOV 操作。即使它是错误的,正确的答案应该是什么?倒数第二步的补码?

感谢任何帮助。谢谢!

【问题讨论】:

  • 我相信你是对的。答案应该是 0x3FFFFFF7。
  • 当你执行它时你得到了什么?
  • @RossRidge 感谢您的确认!
  • @dwelch 抱歉,我不知道如何在计算机上执行汇编程序。 ://

标签: assembly arm mov


【解决方案1】:

当然可以……

startup.s:

.globl _start
_start:
    mov sp,#0x20000
    bl notmain
hang: b hang

.globl PUT32
PUT32:
    str r1,[r0]
    bx lr

.globl GET32
GET32:
    ldr r0,[r0]
    bx lr

.globl TEST
TEST:
    MVN R0,#0x8C,4
    bx lr

你好.c

void PUT32 ( unsigned int, unsigned int );
unsigned int GET32 ( unsigned int );
unsigned int TEST ( void );
static void uart_putc ( unsigned int x )
{
    PUT32(0x101f1000,x);
}
static void bitstring ( unsigned int d )
{
    unsigned int ra;

    for(ra=0;ra<32;ra++)
    {
        if(d&0x80000000) uart_putc(0x31);
        else             uart_putc(0x30);
        d<<=1;
    }
    uart_putc(0x0D);
    uart_putc(0x0A);
}
int notmain ( void )
{
    bitstring(0x12345678);
    bitstring(TEST());
    return(0);
}

内存映射:

MEMORY
{
    rom  : ORIGIN = 0x00010000, LENGTH = 32K
}

SECTIONS
{
   .text : { *(.text*) } > rom
}

生成文件:

CROSS_COMPILE ?= arm-linux-gnueabi

AOPS = --warn --fatal-warnings 
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding 

hello_world.bin : startup.o hello.o memmap
    $(CROSS_COMPILE)-ld startup.o hello.o -T memmap -o hello_world.elf
    $(CROSS_COMPILE)-objdump -D hello_world.elf > hello_world.list
    $(CROSS_COMPILE)-objcopy hello_world.elf -O binary hello_world.bin

startup.o : startup.s
    $(CROSS_COMPILE)-as $(AOPS) startup.s -o startup.o

hello.o : hello.c 
    $(CROSS_COMPILE)-gcc -c $(COPS) hello.c -o hello.o

clean :
    rm -f *.o
    rm -f *.elf
    rm -f *.bin
    rm -f *.list

然后

apt-get install qemu-system-arm binutils-arm-linux-gnueabi gcc-arm-linux-gnueabi
make
qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin

然后按 ctrl-alt-3(3 而不是 F3)来获取串行控制台。你会在哪里看到你的答案...

关闭该控制台窗口将退出 qemu。

或者,如果您有树莓派、beaglebone 或 C.H.I.P 或许多其他在 qemu 或其他任何地方运行 linux 或 linux on arm 的板。

测试.s

.globl TEST
TEST:
    MVN R0,#0x8C,4
    bx lr

main.c

#include <stdio.h>
extern unsigned int TEST ( void );
int main ( void )
{
    printf("0x%08X\n",TEST());
    return(0);
}

然后

as test.s -o test.o
gcc main.c test.o -o main.elf
./main.elf

裸机路线在这些平台上非常简单。只需要实际初始化 uart,然后等待 rx 缓冲区为空,不能像在模拟器中那样作弊。

很遗憾,您不能在微控制器上执行此操作,因为这些天大多是基于 cortex-m 的

.thumb
.thumb_func
.globl TEST
TEST:
    MVN R0,#0x8C,4
    bx lr

那行不通

test.s: Assembler messages:
test.s:6: Error: unshifted register required -- `mvn R0,#0x8C,4'

如果你有一个基于 ARM7TDMI 的微控制器(或其他非 cortex-m)并且有 jtag,或者即使上面有 jtag,你只需要给它一条指令。 (也可以使用 gdb,即使使用 qemu)将一条指令输入内存中的某处

   1001c:   e3e0028c    mvn r0, #140, 4 ; 0xc0000008

所以 0xe3e0028c 是该指令的 r0 版本。并逐步完成它,然后转储寄存器,您也可以看到您的答案。

您知道 gdb 实际上已经或应该有内置或可用的 armulator,因此您可能只需要它。

整个程序:

.globl _start
_start:
    MVN R0,#0x8C,4
    b .

那么 arm-linux-gnueabi-ld test.s -o test.o arm-linux-gnueabi-ld -Ttext=0x8000 test.o -o test.elf

获取 gdb

apt-get install gdb-arm-linux-gnueabi

然后弄清楚如何使用 armulator 在 gdb 中加载和运行它,然后停止它并转储寄存器。

编辑

感谢这个问题,我学到了一些东西...链接不好,还有其他预先构建的工具链,但在撰写本文时这里是一个

https://launchpad.net/gcc-arm-embedded

然后得到visualboyadvance。 windows mac linux 支持这些。

编写这个 test.s 程序

.globl _start
_start:
    MVN R0,#0x8C,4
    b .

使用该工具链

arm-none-eabi-as test.s -o test.o
arm-none-eabi-ld -Ttext=0x02000000 test.o -o test.elf
arm-none-eabi-objcopy test.elf -O binary  test.mb

在一个窗口中

vba -Gtcp test.mb

在另一个

arm-none-eabi-gdb

在gdp提示符下输入这三个命令

target remote localhost:55555
si
info registers

然后你可以使用quit退出,它也会退出vba,或者为我做...

【讨论】:

  • 只需 7 个简单的步骤!除了你遗漏了一些东西。就像在他的电脑(如果他有的话)或学校的电脑(如果没有的话)上安装 Linux。哦,你还漏掉了他的问题的答案。
  • 嗯,我猜你不能那样 apt-get gdb。
  • 我确实回答了这个问题,如何找到它。如果您没有 linux,那么在 usb 或 cdrom 上启动 live linux 并按照步骤操作很简单……也可以在 windows 或 mac 上运行这些工具。
  • 也发现了许多模拟器。可以破解该指令的代码行并运行...
  • launchpad.net/gcc-arm-embedded 会给你一个 gdb,但它里面没有 armulator。但你可以让视觉男孩提前和gdb进入......我假设......
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多