Сборка - зарегистрируйте EAX и операнд - PullRequest
0 голосов
/ 24 ноября 2011

Я пытался написать программу на ассемблере, которая вычисляет операнд_a + операнд_b.

Моя большая проблема, если эти операнды и операндб представимы в 16-байтовом (4 d-слова). Поэтому я написал этот код:

mov eax, operanda
mov ebx, operandb
add eax, ebx

Но тогда я понял, что мой операнд больше 32-битного.

Я что-то пропустил?

Ответы [ 3 ]

1 голос
/ 03 декабря 2011

Существует флаг переноса для выполнения дополнений, превышающих размер меча. Просто добавьте два наименее значимых слова, используя add. Это установит флаг переноса, если дополнение не помещается в меч. Затем добавьте следующие два слова, используя adc. Это добавит два меча-операнда плюс флаг переноса. Продолжайте добавлять мечи, используя adc, пока не дойдете до двух наиболее значимых мечей.

1 голос
/ 03 декабря 2011

Определите другую переменную, operandc, для результата.

Затем сделайте длинное дополнение от наименее значимых мечей к наиболее значимым мечам, не забывая о промежуточных переносах:

mov eax, dword ptr [operanda]
add eax, dword ptr [operandb]
mov dword ptr [operandc], eax

mov eax, dword ptr [operanda+4]
adc eax, dword ptr [operandb+4]
mov dword ptr [operandc+4], eax

mov eax, dword ptr [operanda+8]
adc eax, dword ptr [operandb+8]
mov dword ptr [operandc+8], eax

mov eax, dword ptr [operanda+12]
adc eax, dword ptr [operandb+12]
mov dword ptr [operandc+12], eax
0 голосов
/ 24 ноября 2011

вам нужно использовать несколько регистров, минимум 2 для x64.ваша сборка указывает на то, что вы используете 32-битную сборку, поэтому вам нужно использовать 4 регистра, что делает его более сложным.

для этого есть класс C ++ здесь , вам нужно толькоэмулируйте метод, но, учитывая его сложность в 32-битных сценариях, вы можете скомпилировать его с точки зрения его использования и дизассемблирования.если вы действительно используете x64, будет полезен .

...