2016-03-21 3 views
0

Я работаю над своим учебником по главе о языке ассемблера и пришел к практической проблеме, которую я не понимаю (раздел о унарных и двоичных операциях довольно минимален, поэтому я довольно утерян).Унарные и двоичные операции в сборке

Вот две инструкции из практики. Я должен дать назначение и значение каждой команды:

addq% RCX, (% RAX)

imulq $ 16, (% Ракс,% гексогена, 8)

Где Значение% rax равно 0x100, значение% rdx равно 0x3, а значение% rcx равно 0x1.

Может кто-нибудь объяснить подробно, как решить обе инструкции? У меня есть ответ в конце книги, но нет никакого реального объяснения, чтобы согласиться с этим. Благодарю.

+0

Не добавляйте несвязанные теги! – Olaf

+0

Извините, мой класс сосредоточен вокруг языка программирования C (а также учебника), поэтому я включил его. –

+0

Но на ваш вопрос нет. – Olaf

ответ

3

Вы должны знать 1) насколько эффективны адреса работают 2) как использовать набор инструкций ссылку, чтобы выяснить, какие инструкции сделать

Короче говоря, disp(%base, %index, scale) является ссылкой памяти для решения %base + %index * scale + disp. Все части, кроме одного, являются необязательными. scale может быть 1, 2, 4 или 8.

Теперь, если вы посмотрите add в руководстве, вы можете видеть, что это только добавляет первый операнд на второй, так что добавляет 1 (значение %rcx) в QWORD в памяти по адресу 0x100 (значение %rax).

Вторая инструкция недействительна, такой формы не существует imul. Может, вы забыли скопировать другой операнд?

Несмотря на то, что этого не существует, мы можем догадаться, что автор хотел, чтобы это означало, а именно, чтобы умножить второй операнд на первый. Таким образом, это умножило бы qword в памяти по адресу 0x100 + 3 * 8 = 0x118 на 16.

+0

Что меня смущает, так это то, что для 1: у них есть назначение как 0x100, а значение - 0x100. Я думал, что addq & rcx, (% rax) превратится в (% rax) +% rcx => 0x100 + 0x1 => 0x101. Для номера 2: у них есть пункт назначения 0x118, а значение должно быть 0x110 –

+0

Это не ** ** добавить '1' в' 0x100'. Он добавляет '1' к qword в памяти по адресу' 0x100'. Теперь, если они сказали вам, что содержимое памяти по этому адресу также равно «0x100», тогда действительно результат может быть «0x101». Для второй инструкции не имеет смысла говорить о назначении и значении, потому что эта инструкция не существует. Убедитесь, что вы скопировали его правильно. – Jester

+1

Я проверял, что я скопировал его правильно. Как это выглядит в моем первоначальном посте, так это то, как это написано в книге. Это похоже на проблему на стр. 127 (страница с номером страницы 107 документа) более ранней версии моего учебника [ссылка на более раннюю версию] (http://citeseerx.ist.psu.edu/viewdoc/download?doi = 10.1.1.138.4401 & rep = rep1 & type = pdf) –

0

Это из практики задачи 3.8 в CS: APP 3/е (глобальное издание)

Address Value 
0x100  0XFF 
0x118  0x11 

Register Value 
%rax  0x100 
%rcx  0x1 
%rdx  0x3 

addq% RCX, (% Ракс)

Для этого вопроса, вы принимаете qword at% rax (0XFF) и добавьте к нему% rcx, поэтому 0XFF + 0x1 = 0x100. Обратите внимание на скобки вокруг (% rax), которые указывают на содержимое, хранящееся в памяти (0XFF), а не на адрес (0x100).

imulq 16 $, (% Rax,% RDX, 8)

Как отмечает шута, правая сторона (% Rax + (% RDX * 8)), которая является 0x118. Значение, сохраненное по этому адресу, равно 0x11. imulq теперь умножает 0x11 * 0x10 (примечание, 16, преобразованное в hex, равно 0x10) и ответьте 0x110.

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