Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

KeIL дебаггер пропускает Литералы

Сб июл 31, 2021 00:18:57

:tea: Запускаю дебагер с емуляцией stm103. Исходный код на ассемблере
Спойлер
Код:
 
.      .word 0x10017000
      .word       stta+1
stta:     add r5, 5
      b opu
opu:    ldr r2,    ddd
      add r7, 7
      .word 0x88668899
      add r8, 3
ddd:    .word 0xf10a0a23
      add r9, 1
      b          stta

(использую clang компилятор и gnu синтаксис, uvision keil 5.35)
Программа работает успешно без ошибок.
Но замечаю, что Литералы ( .word ) успешно пропускаются виртуальным процессором, как будто машина знает, что их нельзя исполнять.
Вроде в программном коде для реального железа Литералы ( .word ) находятся после окончания кода, чтобы процессор не вздумал их выполнять как команды. Поэтому их не располагают посреди кода, а я, ради эксперимента, расположил и получил неожиданный результат — пропуск любого .word вместо попытки выпольнить .
Это особенность виртуального дебагера?
Или я не правильно понимаю архитектуру cortex m3?
Внизу вложение из моей проги.
Вложения
кеил.jpg
дебагер
(148.78 KiB) Скачиваний: 105
Последний раз редактировалось radioasm Сб июл 31, 2021 23:31:11, всего редактировалось 1 раз.

Re: KeIL дебаггер пропускает Литералы

Сб июл 31, 2021 10:52:36

Неправильно понимаете. Вы расположили данные (с помощью директивы .word) прямо между командами. Работать, естественно, ничего не будет (процессор будет пытаться выполнить эти данные как команды со всеми вытекающими). Литералы используются только с командами вроде LDR -- для загрузки "сложных" значений в регистры ("простые" значения можно загрузить MOVом, а "сложные" -- нельзя). Насчёт ГНУсного синтаксиса не особо в курсе, ну а в нормальном (АРМовском) литералы записываются прямо в самих командах: LDR R5,=0x12345678

Re: KeIL дебаггер пропускает Литералы

Вс авг 01, 2021 00:26:13

Немного изменил вопрос. А то криво написал первый раз.
Работать, естественно, ничего не будет (процессор будет пытаться выполнить эти данные как команды со всеми вытекающими).

Я с Вами согласен . А вот виртуальный дебаггер КЕИЛ не согласен с Вами и пропускает любой .word , хотя должен пытаться выполнить как инструкцию. . Почему? Фича такая?
Ниже мои размышления по поводу терминологии.
Литералы используются только с командами вроде LDR -- для загрузки "сложных" значений в регистры

LDR R5,=0x12345678 Это псевдо инструкция, ее нет в реальности. компилятор ее заменит на
Код:
     LDR      r5,[pc,#12]  ; #12 — зависит от смещения на адрес Литерала

И еще из Википедии — Литерал (англ. literal) — запись в исходном коде компьютерной программы, представляющая собой фиксированное значение....
Так что любой .word в исполняемой области микроконтроллера — это Литерал, и с ним умеет работать только LDR.
https://www.keil.com/support/man/docs/a ... 147760.htm — вот отсюда взял такие мысли.
"простые" значения можно загрузить MOVом,

"простые" значения в документации именуются "immediate value". И еще цытата из документации — You can generate any 32-bit immediate with a MOV, MOVT instruction pair.

Re: KeIL дебаггер пропускает Литералы

Вс авг 01, 2021 07:42:49

Немного изменил вопрос. А то криво написал первый раз.
У вас талант - писать чтобы было непонятно. Программу, чтобы не понял отладчик. Сообщение, чтобы не поняли форумчане.

Re: KeIL дебаггер пропускает Литералы

Вс авг 01, 2021 23:10:27

Все таки программа выполняется правильно,
Только Симулятор uVision самостоятельно .word игнорирует , без указаний со стороны кода.
Может в настройках виртуального дебаггера надо где то галочку поставить?
А есть какие либо еще виртуальные дебагеры от других разработчиков?

Re: KeIL дебаггер пропускает Литералы

Пн авг 02, 2021 21:14:23

Безымянный.png
(49.77 KiB) Скачиваний: 82

Я сам разобрался.
Надо снять галочку DEBUG INFORMATION.
И симулятор работает как реальное железо.
Ответить