LINUX.ORG.RU

big-endian little-endian

 


0

1
$ echo "mov r0, #0xff" | arm-none-linux-gnueabi-as -mcpu=cortex-a7 -EL
$ arm-none-linux-gnueabi-objdump -d a.out 
a.out:     file format elf32-littlearm
Disassembly of section .text:
00000000 <.text>:
   0:   e3a000ff        mov     r0, #255        ; 0xff
$ hexdump a.out | grep ff
0000030 0008 0005 00ff e3a0 2841 0000 6100 6165

$ echo "mov r0, #0xff" | arm-none-linux-gnueabi-as -mcpu=cortex-a7 -EB
$ arm-none-linux-gnueabi-objdump -d a.out 
a.out:     file format elf32-bigarm
Disassembly of section .text:
00000000 <.text>:
   0:   e3a000ff        mov     r0, #255        ; 0xf
$ hexdump a.out | grep ff
0000030 0800 0500 a0e3 ff00 0041 0000 6128 6165

Википедия пишет, что для 32-битного слова число

0xe3a000ff
будет представлено так
le ff00a0e3
be e3a000ff



Последнее исправление: panzerito (всего исправлений: 2)

Ответ на: комментарий от panzerito

hexdump -c , тебе же сказали. hexdump понятия не имеет, какая у тебя там в файле endianness и по-дефолту выдаёт байты парами в endianness системы на которой запущен (опция -x).

Stanson ★★★★★
()
Ответ на: комментарий от Elyas

А это баг qemu/gdb или так должно быть?

Дебаг arm программы на qemu

$ qemu-system-arm -M lm3s6965evb -cpu cortex-m3 -S -gdb tcp::1234 -nographic -kernel test.bin

(gdb) disas main
Dump of assembler code for function main:
   0x000000b8 <+0>:     push    {r7}
   0x000000ba <+2>:     sub     sp, #20
...
(gdb) x /2i 0xb8
   0xb8 <main>: push    {r7}
   0xba <main+2>:       sub     sp, #20
(gdb) x /4xb 0xb8
0xb8 <main>:    0x80    0xb4    0x85    0xb0
(gdb) monitor x /4xb 0xb8
000000b8: 0x80 0xb4 0x85 0xb0
(gdb) monitor x /2i 0xb8
0x000000b8:  b085b480      addlt        fp, r5, r0, lsl #9
0x000000bc:  f245af00      vmax.f32     d26, d5, d0
(gdb) monitor x /2i 0xb9
0x000000b9:  b480       push    {r7}
0x000000bb:  b085       sub     sp, #20
(gdb) monitor x /4xb 0xb9
000000b9: 0xb4 0x85 0xb0 0x00

На команду

(gdb) monitor x /2i 0xb8
происходит интерпретация thumb-кода как arm-кода. С 0xb9 все почему-то становится правильно, но ведь инструкции должны дизассемблироваться как 0x85b4 0x00b0.

panzerito
() автор топика
Последнее исправление: panzerito (всего исправлений: 4)
Ответ на: комментарий от panzerito

На последнем gdb-8.2 точно также

set arm force-mode ничего

(gdb) set arm force-mode thumb
(gdb) monitor x /2i 0xb9
0x000000b9:  b480       push    {r7}
0x000000bb:  b085       sub     sp, #20
(gdb) monitor x /2i 0xb8
0x000000b8:  b085b480      addlt        fp, r5, r0, lsl #9
0x000000bc:  f245af00      vmax.f32     d26, d5, d0

panzerito
() автор топика

xxd просто визуально группирует байты в полуслова, a hexdump слишком самостоятельный

$ xxd -g 2 a.out | grep ff
0000030: 0800 0500 ff00 a0e3 4128 0000 0061 6561  ........A(...aea
$ xxd -g 4 a.out | grep ff
0000030: 08000500 ff00a0e3 41280000 00616561  ........A(...aea

panzerito
() автор топика
Последнее исправление: panzerito (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.