GBA ASM - День 21: LDRH и STRH — Архив WASM.RU

Все статьи

GBA ASM - День 21: LDRH и STRH — Архив WASM.RU

Повтори?

Сегодня мы рассмотрим две инструкции, о которых в силу некоторых причин я совершенно забыл. Фактически, из-за этого я писал довольно неэффективный код. Эти инструкции ldrh и strh.

Эти инструкции загружают/сохраняют половину слов. Они работают так же как и обычные STR и LDR, не считая того, что используют только нижние 16 битов регистра(ов). Очевидно, что это должно помочь с теми регистрами памяти, которые только 16 битов размером.

Однажды я был на форуме GBADev, чтобы узнать, как решить проблему с одним моим макросом. Он должно был устанавливать номер спрайта в OAM, но в силу неустановленных причин он не работал.

Поэтому один очень умный человек дал мне пример кода, использующий LDRH и STRH, и который работал превосходно. Я совсем забыл о существовании этих двух инструкций. Поэтому, чтобы познакомить вас с этими магическими инструментами перемещающей данные силы, я объясню этот макрос.

Переходим к нему

Вот сам макрос:

	@macro SetNumber sprite, number
		ldr r3,=(OAM+(sprite*8))+6  ; загружаем в r3 адрес номера тайла
		ldr r4,=number  ; затем загружаем номер в нижние биты (как обычно)
		strh r4,[r3]  ; и сохраняем нижние 16 бит куда нужно
	@endm

Я понимаю, что это демонстрирует только инструкцию STRH, чтобы загрузить что-то используйте LDRH следующим образом:

	ldrh r3,[r1]  ; обратите внимание, что мы берём 16 битов по адресу в r1
	              ; и помещаем в r3

Также как и в старые времена, не считая 16-ти бит.

Обзор этого дня

Мои благодарности помогшему на форуме GBADev человеку, который напомнил мне об этих инструкциях.

Эти инструкции очень полезны для создания более полезного кода. Используйте их правильно.

2002-2013 (c) wasm.ru