2014-12-25 3 views
0

Я новичок в языке ассемблера. Я смущен про код ниже:Вопросы на языке ассемблера о непрямой загрузке/хранении

0x0100: load #varstr R2 
     store R2 varptr 
     jump whilebool 

loop: load varptr R3 
     **load R3 R4** 
     store R4 0xfff0 
     load #'\n' R4 
     store R4 0xfff0 
     load varptr R3 
     load #1 R5 
     add R3 R5 R3 
     store R3 varptr 

whilebool: load varptr R1 
     **load R1 R2** 
     jumpnz R2 loop 
     halt 

varptr:  block 1 
varstr:  block #"Hello" 

Я не понимаю смысл содержания, выделенного жирным шрифтом. Я думаю, что за первое место, он просто может быть записан в виде нагрузки VARPTR R3 и R3 магазина 0xfff0

Спасибо за ваше время

ответ

0

Вы должны уточнили архитектуру.

Гадание из того, что название говорит indirect load/store я бы сказал, что load R3 R4 не просто делать R4 = R3, вместо этого он делает R4 = memory[R3] так, что называется косвенность. Если это так, вы, очевидно, не можете пропустить этот шаг.

varptr изначально настроен, чтобы указать на начало varstr. Ваш цикл сначала загружает этот указатель в R3, затем загружает символ, на который ссылаются, R4. Затем символ записывается в адрес 0xfff0, который, как я полагаю, является устройством вывода с отображением памяти. Он печатает новую строку после каждого символа. Код затем увеличивает значение varptr на один, чтобы он указывал на следующий символ. Наконец, блок whilebool проверяет, достигнут ли конец строки, проверяя, равен ли текущий символ нулю. Для этого необходимо снова разыскать указатель.

Существует много способов упростить этот код, но удаление косвенности не является одним из них;)

Смежные вопросы