Метки - это адреса (и обратите внимание, что имена функций в языках высокого уровня в основном являются метками).
loop:
nop
nop
jump loop
это позволяет вам писать код, который имеет две функции. Во-первых, каков адрес цикла, 0x12345 или 0x8000 и т. д. Во-вторых, если моя инструкция псевдокода, установленная здесь, инструкция перехода работает с фиксированными адресами, поэтому для полного кодирования нужно знать 0x12345 или 0x8000. Инструкция или это относительно, где без меток программисту пришлось бы считать байты инструкции. Если бы nops были одним байтом каждый, а сам переход относителен, и, скажем, три байта, а смещение pc относительно конца инструкции, тогда вам нужно было бы сказать jump -5 в вашем коде, тогда, если вы добавили или удалили инструкции в loop вам придется пересчитывать смещения прыжка без ошибок.
Другой случай, который снова касается адреса, относится к внешним ссылкам:
fun:
call more_fun
...
Если вы находитесь в наше время, когда вы можете сделать более одного файла исходного кода объектами, а затем связать их. (некоторые инструменты все еще поддерживают это, это было более распространено, когда я начал иметь один ассемблерный файл с .org и т. Д., И никаких внешних ссылок, только прямые и обратные ссылки). Затем вы можете иметь внешние ссылки, независимо от того, использует ли набор инструкций абсолютная или относительная адресация, чтобы завершить создание машинного кода для этого вызова, этот адрес необходимо разрешить. Таким образом, использование метки значительно упрощает работу программиста, и, как и в случае с локальными ссылками, инструменты могут вычислить все эти смещения или адреса для вас.
Редактировать
.thumb
nop
nop
nop
loop:
nop
nop
nop
b loop
Disassembly of section .text:
00000000 <loop-0x6>:
0: 46c0 nop ; (mov r8, r8)
2: 46c0 nop ; (mov r8, r8)
4: 46c0 nop ; (mov r8, r8)
00000006 <loop>:
6: 46c0 nop ; (mov r8, r8)
8: 46c0 nop ; (mov r8, r8)
a: 46c0 nop ; (mov r8, r8)
c: e7fb b.n 6 <loop>
поэтому второй столбец чисел (оба столбца в шестнадцатеричном формате) — это машинный код. Вы можете видеть, что на этикетке нет машинного кода, это просто этикетка, маркировка на коробке, она описывает вещь на коробке, а не содержимое своей коробки.
И я просто скажу вам, что ветвь к циклу, кодирующему младшие биты, является смещением, и в этом значении много единиц, потому что это отрицательное число (обратная ветвь относительно ПК).
Указанные выше адреса не связаны.
Один файл:
.thumb
nop
nop
loop:
bl more_fun
b loop
Другой:
.thumb
.thumb_func
.globl more_fun
more_fun:
bx lr
unlinked мы видим, что дизассемблированный вызов (ссылка ветвления bl в этом наборе инструкций) имеет в основном заполнитель для смещения.
Disassembly of section .text:
00000000 <loop-0x4>:
0: 46c0 nop ; (mov r8, r8)
2: 46c0 nop ; (mov r8, r8)
00000004 <loop>:
4: f7ff fffe bl 0 <more_fun>
8: e7fc b.n 4 <loop>
когда-то связанный
Disassembly of section .text:
00001000 <loop-0x4>:
1000: 46c0 nop ; (mov r8, r8)
1002: 46c0 nop ; (mov r8, r8)
00001004 <loop>:
1004: f000 f801 bl 100a <more_fun>
1008: e7fc b.n 1004 <loop>
0000100a <more_fun>:
100a: 4770 bx lr
инструкция bl изменена, чтобы иметь относительное смещение pc.
Всю эту магию делают инструменты, и нам нужно только следить за метками. Это то же самое для самих инструкций, которые мы можем использовать для чтения/записи человеком:
bx lr
вместо машинного кода:
0x4770
В наших программах.
person
old_timer
schedule
02.02.2021