Как создать ассемблер, который использует только регистр для представления идентификаторов? - PullRequest
0 голосов
/ 21 октября 2011

Чтобы уточнить, вопрос:

Зарплата = reghours * 3 + сверхурочных часов * 2 - выгоды * 3

Нельзя использовать переменные (.data) ...

Это то, что я создал до сих пор:

    mov eax,3
    mov ebx,2
    mul ebx
    call dumpRegs

    mov ecx,2
    mov ebx,2
    mul ebx
    call dumpRegs

    mov edx,3
    mov ebx,5
    mul ebx
    call dumpRegs

хорошо, две вышеприведенные инструкции вычисления правильны по регистру edx, по-прежнему равны нулю?

мой вопрос, как получитьрасчет заработной платы, который будет включать в себя reg + reg - reg с общей суммой reg?

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Ссылаясь на 3-746 Vol.2A мы видим, что используемая вами инструкция mul:

F7 /4 MUL r/m32    Unsigned multiply (EDX:EAX ← EAX ∗ r/m32).

Другими словами eax умножается на данный операнд (в данном случае ebx), чтобы получить64-битный результат хранится в edx:eax, то есть 32 старших разряда сохраняются в edx, а 32 младших разряда в eax.

Итак:

    mov eax,3
    mov ebx,2
    mul ebx

Будетустановите edx:eax в 6 = 00000000:00000006, поэтому edx очищается.

Стандартный способ сохранения регистров - поместить их в стек (push edx), а затем восстановить их (pop edx).).Поскольку в вашей программе не так много переменных, вы также можете использовать одну из подписанных инструкций умножения, для которых не требуются операнды и результат должен быть в edx и eax.

например

IMUL r32, r/m32, imm32  doubleword register ← r/m32 ∗ immediate doubleword. 

Что позволяет сделать imul eax, eax, 3 для умножения eax на 3.

Объедините это с @ ответом Пита Уилсона для фактического расчета значения.

2 голосов
/ 21 октября 2011

Шаг 1: Выполните каждую из трех операций с более высоким приоритетом в порядке, который будет иметь смысл при переходе к шагу 2:

benifit * 3        // question: why would you do this calculation first?
reghours * 3
overtimehours * 2

После каждого из этих вычисленийпоместите промежуточный результат в стек.

Шаг 2: Когда все три вычисления завершены, начните вычислять окончательный результат, выталкивая каждый из трех промежуточных результатов из стека.

Вуаля: нет места для данных.Это домашнее задание может помочь вам понять и использовать стек.Кстати, вы не проверяли тег домашней работы.

Вы также можете решить эту проблему, сохранив промежуточные результаты в регистрах, но это немного сложнее: т. Е. Требует, чтобы вы тщательно продумали, какой промежуточныйрезультаты для сохранения и когда рассчитать и сохранить их.

...