Вопрос о настройке и сравнении в сборке - PullRequest
0 голосов
/ 18 октября 2019

У меня проблемы с пониманием этого упражнения. Я сделаю все возможное, чтобы высказать свое мнение, и я надеюсь, что вы, ребята, сможете дать мне представление о том, что демонстрирует каждая строка кода. Используемая нами сборка x86, предполагается, что значение хранится в% rax = x

xorq  %rax, %rax // value stored in %rax: x ^ x = 0
addq  $-1,  %rax // value stored in %rax: 0 - 1 = -1
movq  %rax, %rbx // value stored in %rbx: -1 or 0xFFFFFFFF
shlq  $2,   %rbx 
shrq  $1,   %rbx // left shift by 3 total, so value stored in %rbx: 0x7fffffff8
addq  %rbx, %rax // value stored in %rax: 0x7fffffff9

. В последней строке мой профессор говорит, что мы на самом деле вычисляем (TMax-1) -1, чего я действительно не получаю.

Вопрос в следующем:

Предполагая, что addq из Q3.2 выполнил, скажем, теперь мы выполнили следующую инструкцию:

setg %bl

Какое значение (в шестнадцатеричном формате, включая префикс) теперь хранится в% rbx?

Я действительно не понимаю, что означает setg (я прочитал спецификацию, но потерял). Большое спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Обратите внимание, у вас есть две левые смены и одна правая, так что это не 3 левых в общей сложности. Также вы используете 64-битные регистры, поэтому значение в rbx перед setg на самом деле 0x7ffffffffffffffe. Запись ссылки набора команд для setg говорит, что результат равен 1, если ZF=0 and SF=OF. Ну, результат сложения равен 0x7ffffffffffffffd, а это не 0, поэтому ZF равно 0. SF, будучи знаковым битом, равен нулю, а OF будучи знаковым переполнением, также равен нулю. Следовательно, условие выполняется, поэтому bl будет 1, но остальная часть rbx не изменится, что даст вам 0x7fffffffffffff01.

0 голосов
/ 18 октября 2019

Добавление RBX к RAX вычисляет RBX - 1, потому что RAX все еще = -1.

Я думаю, TMax - 1 означает INT64_MAX - 1.

Два сдвига влево и одно вправо дают вамчисло с очищенным старшим битом (неотрицательным) и очищенным младшим битом. Максимальное положительное число (дополнение 2) - это все установленные биты, кроме знакового бита, и это на единицу меньше этого.

Шут объяснил, как setg работает на основе EFLAGS, установленной add. Посмотрите в руководстве setcc.

...