2016-04-29 12 views
0

Dies ist ein Problem, das auf eine Prüfung kam, aber ich kann die Lösung nicht verstehen.MVN mit Rotary Arm Anweisung

Die ARM-Anweisung ist MVN R7, # 0x8C, 4 und ich muss den Wert finden, der in R7 gespeichert ist.

Die Lösung ist wie folgt:

= 0x8C ROR 4

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

= (1100 0000 0000 0000 0000 0000 0000 1000)

0xC0000008 =

Das sieht für mich nicht richtig aus, da MVN das Komplement übernimmt und die obigen Schritte wie eine einfache MOV-Operation aussehen. Auch wenn es falsch ist, was sollte die richtige Antwort sein? Ergänzung des vorletzten Schritts?

Jede Hilfe wird geschätzt. Vielen Dank!

+2

Ich glaube, Sie sind richtig . Die Antwort sollte 0x3FFFFFF7 sein. –

+0

wenn du es ausgeführt hast, was hast du bekommen? –

+0

@RossRidge Vielen Dank für die Bestätigung! –

Antwort

1

sicher, Sie können ...

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 

dann

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 

und drücken Sie Strg-Alt-3 (3 nicht F3), um die serielle Konsole zu erhalten. wo Sie Ihre Antwort sehen werden ...

und Schließen dieses Konsolenfensters beendet qemu.

Oder wenn Sie ein Raspberry Pi oder ein Beaglebone oder C.H.I.P oder viele andere Boards mit Linux oder Linux auf Arm in Qemu oder anderswo haben.

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

und dann

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

Die Route blanke Metall ist recht einfach auf diesen Plattformen. Müssen Sie nur die UART init, und warten Sie, bis der RX-Puffer leer ist, kann nicht schummeln, wie Sie in einem Simulator können.

Leider kann nicht Sie dies auf einem Mikrocontroller tun, da in diesen Tagen die meist Cortex-m basieren

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

und das nicht funktioniert

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

Wenn Sie ein ARM7TDMI basierte Mikrocontroller (oder andere Nicht-Kortex-m) und haben Jtag, oder sogar mit den oben genannten mit Jtag Sie müssen nur die eine Anweisung zu füttern. (Kann gdb als auch, sogar mit qemu) füttern die einen Befehl in den Speicher irgendwo

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

so 0xe3e0028c ist die r0 Version dieses Befehls. Und durchlaufen Sie es und lassen Sie dann die Register fallen, die Sie Ihre Antwort auch sehen können.

Sie wissen, gdb hat oder sollte den Armulator eingebaut haben oder verfügbar, so dass Sie nur brauchen könnten.

das gesamte Programm:

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

dann Arm-Linux-gnueabi-ld test.s -o test.o Arm-Linux-gnueabi-ld -Ttext = 0x8000 test.o -o-Test .elf

und gDB

apt-get install gdb-arm-linux-gnueabi 

und dann herauszufinden, wie es in gDB zu laden und auszuführen, die ARMulator verwenden, dann stoppen und die Register-Dump.

EDIT

Vielen Dank für diese Frage, habe ich gelernt, ein paar Dinge ... Links sind schlecht, es gibt auch andere vorgefertigte Werkzeugketten, aber zum Zeitpunkt des Schreibens hier ist ein

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

und dann visualboyadvance bekommen. Diese werden unter Windows Mac Linux unterstützt.

Schreib test.s dieses Programm

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

, dass unter Verwendung von Werkzeugkette

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 

In einem Fenster

vba -Gtcp test.mb 

in einem anderen

arm-none-eabi-gdb 

Am gdp Prompt diese drei Befehle

target remote localhost:55555 
si 
info registers 

eingeben und dann können Sie verwenden, beenden auszutreten, es vba auch, oder hat für mich verlassen wird ...

+0

Nur 7 einfache Schritte! Außer du hast ein paar Dinge weggelassen. Zum Beispiel die Installation von Linux auf seinem PC (wenn er einen hat) oder die Computer der Schule (wenn nicht). Oh, und du hast auch eine Antwort auf seine Frage weggelassen. –

+0

hmm, ich denke du kannst apt-get gdb nicht so bekommen. –

+0

Ich habe die Frage beantwortet, wie man es findet. Wenn Sie kein Linux haben, dann ist es einfach, ein Linux auf einem USB-Stick oder CD-ROM zu booten und dann folgen Sie einfach den Schritten ... können diese Tools auch auf Windows oder Mac ausführen. –