Inhaltsverzeichnis

Raspberry Pi ARM assembly

Hier sammle ich Kommandos die für Assembler auf dem Raspberry Pi notwendig/hilfreich sind. Ich gehe davon aus dass die Befehle direkt auf dem Raspberry Pi ausgeführt werden (oder halt via SSH).

Kommandos

Mit "as" von Quelltext zu Objekt Code

Das Ergebnis ist dann noch nicht ausführbar und muss noch mit „ld“ gelinked werden (oder alternativ gcc).

as 002.asm -o 002.o
file 002.o
002.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped

Linken

ld 002.o -o 002.elf

alternativ: („-nostdlib“ da mein Quelltext bisher äußert simpel ist ;))

gcc 002.o -o 002.elf -nostdlib
file 002.elf 
002.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

Debug mit gdb

Notizen für die Benutzung von gdb

Breakpoint setzen

(gdb) break _start
Breakpoint 1 at 0x10074

Programm ausführen

(gdb) run
Starting program: /home/pi/arm-assembly/002.elf 

Breakpoint 1, 0x00010074 in _start ()

Programm disassemblen

(gdb) disass
Dump of assembler code for function _start:
=> 0x00010074 <+0>:	mov	r7, #4
   0x00010078 <+4>:	mov	r0, #1
   0x0001007c <+8>:	ldr	r1, [pc, #36]	; 0x100a8 <_start+52>
   0x00010080 <+12>:	mov	r2, #19
   0x00010084 <+16>:	svc	0x00000000
   0x00010088 <+20>:	mov	r7, #3
   0x0001008c <+24>:	mov	r0, #0
   0x00010090 <+28>:	ldr	r1, [pc, #20]	; 0x100ac <_start+56>
   0x00010094 <+32>:	mov	r2, #1
   0x00010098 <+36>:	svc	0x00000000

Register ansehen

(gdb) info reg
r0             0x0                 0
r1             0x0                 0
r2             0x0                 0
r3             0x0                 0
r4             0x0                 0
r5             0x0                 0
r6             0x0                 0
r7             0x0                 0
r8             0x0                 0
r9             0x0                 0
r10            0x0                 0
r11            0x0                 0
r12            0x0                 0
sp             0xbefff360          0xbefff360
lr             0x0                 0
pc             0x10074             0x10074 <_start>
cpsr           0x10                16
fpscr          0x0                 0

Nächste Instruktion

(gdb) ni
0x0001007c in _start ()
(gdb)  

gdbserver und remote

Ich hatte in einigen Fällen STDOUT nicht in der gdb-cmd-Ausgabe (zumindes nicht, wie ich es erwartet hatte). In solchen Fällen hilft es das Programm über gdbserver zu starten

gdbserver 127.0.0.1:12345 003.elf aaaabbb
Listening on port 12345
Remote debugging from host 127.0.0.1
aaaabbb

Nun steuert man das Programm remote via

gdb
target remote :12345
break _start
cont

Umfangreichere gdb-Ansicht

Mein Favorit ist „lay regs“ da es die Register, den disassembled Code und die Command-Box zeigt.

(gdb) lay regs

Wer dies gern nutzt, sollte es in der ~/.gdbinit hinterlegen. Mit „focus cmd“ funktioniert dann der „Pfeil nach oben“ auch wieder. Wer im ASM-Code navigieren möchte, setzt den „focus asm“ oder „focus prev“.

Speicher an einer bestimmten Stelle/Adresse inspizieren

(gdb) x/s 0x200db
0x200db:        "A\021"

Verschiedene Ausgaben

(gdb) p/d 0xA # hex to dec
$1 = 10
(gdb) p/t 0xA # hex to bin
$2 = 1010
(gdb) p/t 0x4 # dec to bin
$3 = 100
(gdb) p/x 10 # dec to hex
$4 = 0xa

objdump

objdump -d

objdump -d <file> # oder -D

objdump -x

objdump -x <file>

strace

Details zu strace

strace ./002.elf 
execve("./002.elf", ["./002.elf"], 0xbe85f3a0 /* 44 vars */) = 0
write(1, "Enter a character: ", 19Enter a character: )     = 19
read(0, Benny
"Benny\n", 8)                   = 6
write(1, "Benny\n", 6Benny
)                  = 6
exit(65)                                = ?
+++ exited with 65 +++