Как я могу загрузить отрицательные значения в регистр — ассемблер

скажи, что у меня есть следующий код:

Код C ++ и встроенный код сборки ниже:

Уравнение:

X=40+5
Y=3*12 ---> X=45 Y=36

Тестовое задание

if x < y - print
x+y

else
print x-y

int main()
{
int x=5,y=3,z=0;
x=x+40;
y=y*12;
if(x<y) //45<36 - cond. is NOT met
z=x+y;
else
z=x-y;
cout << "z:" << z << endl; // z=9
x=5,y=3,z=0;
__asm
{
pushad
mov eax,0
mov ebx,0
mov eax,x
add eax,40
mov ebx,y
imul ebx,12
cmp eax,ebx
jb First ;cond is NOT met
jmp Second ;we jump to Second label
First: add eax,ebx
mov z,eax
Second: sub eax,ebx
mov z,eax
popad

}
cout << "z:" << z << endl; //z=9
return 0;
}

Оба результата дают z = 9, но если я изменю y = -3 в C ++ и ассемблерном коде соответственно
(int x=5,y=-3,z=0; И в x=5,y=-3,z=0;) я должен получить z = 81, но на выходе это встроенная сборка z = 45, поэтому я не могу правильно загрузить значение neg (-3) в регистр ebx …
Мой вопрос, как я могу загрузить -3 в ebx, чтобы я получил 45 — (- 36) = 81?

0

Решение

Я думаю, что проблема у вас в том, что jb использует сравнение без знака; вы, вероятно, хотите использовать jl вместо.

3

Другие решения

Две проблемы — одна, как уже указывали другие, заключается в том, что вы использовали инструкцию перехода, основанную на сравнении без знака.

Другой заключается в том, что после выполнения кода в First, затем вы выполняете код в Second, Вы обычно хотели бы иметь безусловное jmp после Second, На данный момент вы добавляете, а затем сразу же вычитаете снова.

Так что вы можете захотеть:

        cmp eax,ebx
jge Second ;cond is not met (I've removed one branch and reversed the test)
First:  add eax,ebx
jmp Store
Second: sub eax,ebx
Store:  mov z,eax ;shared by both paths
2

использование JL вместо JB, Один — со знаком сравнения, другой — без знака.

1
По вопросам рекламы [email protected]