2016-04-29 4 views
0

Это проблема, возникшая на экзамене, но я не могу понять ее решение.MVN с инструкцией поворотного кронштейна

Инструкция ARM представляет собой MVN R7, # 0x8C, 4, и мне нужно найти значение, которое хранится в R7.

Решение заключается в следующем:

= 0x8C ROR 4

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

= (1100 0000 0000 0000 0000 0000 0000 1000)

= 0xC0000008

Это не выглядит так, как MVN включает в себя прием дополнения, и вышеупомянутые шаги выглядят как простая операция MOV. Даже если это неверно, какой должен быть правильный ответ? Дополнение предпоследнего шага?

Любая помощь приветствуется. Благодаря!

+2

Я считаю, что ты прав , Ответ должен быть 0x3FFFFFF7. –

+0

, когда вы его выполнили, что вы получили? –

+0

@ RossRidge Спасибо за подтверждение! –

ответ

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 

hello.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); 
} 

memmap:

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

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

Makefile:

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.

Если у вас есть малина pi или beaglebone или C.H.I.P или многие другие платы, на которых работает linux или linux на руке в qemu или где-либо еще.

test.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-буфер не будет пустым, не может обмануть, как вы можете, в симуляторе.

К сожалению, вы не можете сделать это на микроконтроллер, так как в эти дни в основном корой-м на основе

.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 (или другого non-cortex-m) и иметь jtag, или даже с приведенным выше с jtag, вам нужно только подать его на одну инструкцию. (Можно использовать GDB, а, даже с QEMU) кормить одну команду в память где-то

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

так 0xe3e0028c является версией r0 этой инструкции. И пройдите через него, а затем сбросьте регистры, вы также можете увидеть свой ответ.

Вы знаете, что gdb на самом деле имеет или должен иметь встроенный в него арматурник или доступный, поэтому вам может понадобиться только это.

вся программа:

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

затем рука-Linux-gnueabi-LD test.s -o test.o рука-Linux-gnueabi-ЛД -Ttext = 0x8000 test.o -o теста .elf

и получить GdB

apt-get install gdb-arm-linux-gnueabi 

, а затем выяснить, как загрузить и запустить его в GDB, используя armulator, то остановить его и сбросить регистры.

EDIT

Спасибо за этот вопрос, я узнал кое-что ... Ссылки плохие, есть и другие преднастроенные компилированные инструменты, но с этим письмом здесь являются один

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

, а затем получить визуальную поддержку. они поддерживаются в 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 

В ввп строке введите эти три команд

target remote localhost:55555 
si 
info registers 

, а затем вы можете использовать бросить курить, чтобы выйти, она выйдет УВУ, а также, или сделал для меня ...

+0

Всего 7 простых шагов! Кроме того, вы оставили в стороне несколько вещей. Как установка Linux на его ПК (если он у него есть) или компьютеры школы (если нет). О, и вы также оставили ответ на свой вопрос. –

+0

Хмм, я думаю, вы не можете использовать gdb. –

+0

Я ответил на вопрос, как его найти. Если у вас нет linux, тогда тривиально загружать live linux на usb или cdrom, а затем просто следовать шагам ... также можно запускать эти инструменты в Windows или Mac. –

Смежные вопросы