Страница 1 из 1

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

Добавлено: Сб июл 31, 2021 00:18:57
radioasm
: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?
Внизу вложение из моей проги.

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

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

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

Добавлено: Вс авг 01, 2021 00:26:13
radioasm
Немного изменил вопрос. А то криво написал первый раз.
[uquote="SII",url="/forum/viewtopic.php?p=4068455#p4068455"]Работать, естественно, ничего не будет (процессор будет пытаться выполнить эти данные как команды со всеми вытекающими).[/uquote]
Я с Вами согласен . А вот виртуальный дебаггер КЕИЛ не согласен с Вами и пропускает любой .word , хотя должен пытаться выполнить как инструкцию. . Почему? Фича такая?
Ниже мои размышления по поводу терминологии.
[uquote="SII",url="/forum/viewtopic.php?p=4068455#p4068455"]Литералы используются только с командами вроде LDR -- для загрузки "сложных" значений в регистры[/uquote]
LDR R5,=0x12345678 Это псевдо инструкция, ее нет в реальности. компилятор ее заменит на

Код: Выделить всё

     LDR      r5,[pc,#12]  ; #12 — зависит от смещения на адрес Литерала
И еще из Википедии — Литерал (англ. literal) — запись в исходном коде компьютерной программы, представляющая собой фиксированное значение....
Так что любой .word в исполняемой области микроконтроллера — это Литерал, и с ним умеет работать только LDR.
https://www.keil.com/support/man/docs/a ... 147760.htm — вот отсюда взял такие мысли.
[uquote="SII",url="/forum/viewtopic.php?p=4068455#p4068455"]"простые" значения можно загрузить MOVом,[/uquote]
"простые" значения в документации именуются "immediate value". И еще цытата из документации — You can generate any 32-bit immediate with a MOV, MOVT instruction pair.

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

Добавлено: Вс авг 01, 2021 07:42:49
VladislavS
[uquote="radioasm",url="/forum/viewtopic.php?p=4068744#p4068744"]Немного изменил вопрос. А то криво написал первый раз.[/uquote]У вас талант - писать чтобы было непонятно. Программу, чтобы не понял отладчик. Сообщение, чтобы не поняли форумчане.

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

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

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

Добавлено: Пн авг 02, 2021 21:14:23
radioasm
Безымянный.png
(49.77 КБ) 114 скачиваний
Я сам разобрался.
Надо снять галочку DEBUG INFORMATION.
И симулятор работает как реальное железо.