Путаница в ассемблере - PullRequest
0 голосов
/ 20 декабря 2018

Мне очень трудно понять этот вопрос на ассемблере, и, взглянув на схему меток, я просто не могу понять, почему мой ответ отличается от приведенного.

Вопрос заключается в следующем

На рисунке 5 показана программа на языке ассемблера вместе с содержимым раздела основной памяти компьютера, на котором эта программабудет выполнен на.Каждая ячейка памяти и регистр могут хранить 16-битное значение.

Набор инструкций на языке ассемблера, который использовался для написания программы, приведен в Таблица 1 на следующей странице.

Рисунок 5

LDR R1, 100
LSL R2, R1, #2
ADD R1, R1, R2
LDR R3, 101
CMP R3, R1
BEQ labela
MOV R4, #0
B labelb
labela:
 MOV R4, #1
labelb:
 STR R4, 102
 HALT 

|---------------------|----------------------|
|    Memory Address   | Main Memory Contents |
|     (in decimal)    |      (in decimal)    |
|---------------------|----------------------|
|        100          |         10           |
|---------------------|----------------------|
|        101          |         50           |
|---------------------|----------------------|
|        102          |         80           |
|---------------------|----------------------|

Вопрос: Заполните приведенную ниже таблицу трассировки в десятичном виде, чтобы показать, как значения, хранящиеся в регистрах и основной памяти, изменяются при выполнении программы на рис. 5.Вам может не понадобиться использовать все строки.

Таблица трассировки:

Trace Table

Таблица 1:

Table 1 Picture

Ответ, который я придумал, таков:

answer

Но ответ по схеме меток такой (1 добавлен в столбце 102):

markscheme answer

Я подумал, что здесь может произойти, что программа выходит из ветви labela и затем возобновляет код в точке после того, как она разветвляется до labela.Однако, если бы это было так, тогда значение ячейки памяти 102 было бы равно 0.

Может кто-нибудь объяснить мне, почему единица переносится в ячейку памяти 102 после выполнения ветви labela?

Заранее спасибо всем, кто отвечает!Извините, если это довольно длинный вопрос, я просто застрял, и после долгих попыток выяснить это самостоятельно я не уверен, куда еще идти.

1 Ответ

0 голосов
/ 20 декабря 2018

Может, кто-нибудь объяснит мне, почему один из них переносится в область 102 памяти после выполнения ветви labela?

Это потому, что метки предназначены только для вашего удобства.Компилятор переводит их в смещение памяти программы, а затем при каждом появлении метки заменяется этим смещением инструкции программы (адресом).

Метка не похожа на метод или функцию в языке программирования более высокого уровня.Зная это, следующие строки выполняются одна за другой от лабелы до HALT

labela:
 MOV R4, #1   // move #1 into R4
labelb:   // there is no such thing in program instuctions, just go on!
 STR R4, 102  // save #1 into mem102
 HALT        //halt

, поэтому, как только вы доберетесь до labela, обратного пути не будет;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...