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 ...
Ich glaube, Sie sind richtig . Die Antwort sollte 0x3FFFFFF7 sein. –
wenn du es ausgeführt hast, was hast du bekommen? –
@RossRidge Vielen Dank für die Bestätigung! –