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).
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
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
Notizen für die Benutzung von gdb
(gdb) break _start Breakpoint 1 at 0x10074
(gdb) run Starting program: /home/pi/arm-assembly/002.elf Breakpoint 1, 0x00010074 in _start ()
(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
(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
(gdb) ni 0x0001007c in _start () (gdb)
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
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“.
(gdb) x/s 0x200db 0x200db: "A\021"
(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 -d <file> # oder -D
objdump -x <file>
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 +++