Определение функции и вывода из этого (очень маленького) кода на ассемблере

#function #assembly #x86

#функция #сборка #x86

Вопрос:

ax является регистром, shl означает, что мы сдвигаемся влево по n значениям… z это адрес памяти, и в начале он содержит значение 4 .

 mov ax, [z]
shl ax, 3
add ax, [z]
shl ax, 1
mov [q], ax
  

Я хотел бы знать, как мы можем прочитать функцию из этого кода?

Итак, в первой строке мы помещаем то, что находится z в регистре ax , хорошо.

Затем мы сдвигаем это значение (4) влево на 3 , так что эта операция в основном выполняется: 2^3 * z

К этому мы add [z] , так что теперь у нас есть 2^3 * z z = 9z

Теперь мы берем 9z и shift оставляем 1 слева, так что у нас есть 9z * 2^1 = 18z

В конце мы берем регистр ax и помещаем его в адрес памяти q , поэтому имеем:

 q(z) = 18z
  

В задаче указано, что z содержит значение 4 , поэтому в этом случае вывод будет

 q(4) = 18*4= 72
  

Я все сделал правильно, от объяснения до решения?Пожалуйста, скажите мне, как мне нужно выполнить подобную задачу на экзамене.

Комментарии:

1. Почему бы не спросить TA или учителя? Какое значение может иметь этот вопрос для этого сайта? Также: почему бы просто не протестировать его. Вам нужно научиться подтверждать или отклонять гипотезу.

2. Если вам нужно, чтобы мы сказали вам, что это правильно, то вы на самом деле ничему не научились. Если мы говорим вам, что это правильно, и вы принимаете это как таковое, то вы действительно ничему не научились. На самом деле в этом вопросе нет смысла.

3. Хорошо, вы умные $ $ es, я вернусь к моему разделу математики, где это намного лучше и приятнее, чем здесь. Я не ожидал, что все будет хорошо, в любом случае, пока, и я желаю вам, ребята, худшего. Удаляем это сейчас, чтобы ты перестал плакать, Тай. «Да» или «нет» было бы достаточно, но я вижу, что даже это слишком много требуется для вас, LOL.

4. Я не просто заботился о решении этого кода, я также заботился о том, как я его описал, если это правильно. Я также указал это в своем вопросе. Отладчик может сообщить мне, правильна ли функция, которую я нашел, но не скажет мне, правильно ли мое описание. Поэтому я не согласен с вами, когда вы говорите «они правы».

5. @cnmesr Вы действительно правы. Вы явно используете z для обозначения ввода функции. Выражение «что находится в z » эквивалентно «что находится по адресу z «. Вы слишком много думаете обо всем этом.

Ответ №1:

Итак, в первой строке мы помещаем то, что находится в z, в регистр ax, хорошо.

Нет, вы помещаете содержимое памяти из значения (адреса) z в ax . Итак ax , = 4, не ax = z . В сборке z эквивалентно символу или адресу, т.е. Некоторой метке ячейки памяти, например, 12340.

(«нет» — вы, вероятно, правильно поняли, я просто хотел подчеркнуть, как [] используется синтаксис Intel x86).

В C = z присваивается значение переменной z , и для получения адреса вам нужно сделать amp;z . В сборке все наоборот z — это адрес, [z] это содержимое. (по крайней мере, в синтаксисе NASM MASM / TASM допускает mov ax,z синтаксическую выборку содержимого, и там вам нужно записать mov ax,offset z , чтобы получить адрес, но я советую не использовать это смешанное использование, когда переменные выбираются автоматически, но для доступа к регистру памяти требуются скобки [rx] , IMO, это сбивает с толку)

Остальное в порядке.

Комментарии:

1. masm ‘mov ax, z’ без скобок — это заноза в заднице, и ее не следует использовать imo. Это несовместимо, это неявно, и нет ничего, чтобы «сделать ассемблер более читаемым» (что, я думаю, было намерением при его представлении)

2. Я думаю, что OP просто использует математическую нотацию, используя z для выражения общего значения по адресу z . Я бы сделал то же самое.

3. @TommyLee2k: Мне действительно нравится синтаксис MASM. Я не вижу двусмысленности. Ясно, что значение переменной z перемещается в ax.

4. @rudy mov ax, z в MASM делает разные вещи в зависимости от того, что z есть. Это не идиоматично в сборке, это должно быть явным и простым. Обращения к памяти обозначаются [] , и это всегда должно быть так.

5. @RudyVelthuis: If z — константа, которую вы определили с EQU помощью or = , это a mov r16, imm16 . В противном случае это mov r16, [mem] . Вы не можете знать, как будет собираться инструкция, не заглядывая в другие разделы программы (даже если вы не используете макросы для замены текста). Я бы предпочел согласованность NASM, даже если изменение чего-либо с постоянной времени сборки (EQU) на статические данные, загружаемые из памяти, означает изменение кода везде, где он используется.