Я беру класс ассемблерного языка и имею проект, но я немного застрял и не могу найти, что не так в моем коде. Проект просит меня написать пару основных арифметических операций (сложение и вычитание) на основе двух значений, которые делятся на мой идентификатор студента.Арифметические операции в языке ассемблера
Мой идентификатор студента имеет 7 цифр, а 3 наиболее значимые цифры хранятся в переменной «слева», которая перемещается для регистрации EAX, причем 4 младших значащих цифры хранятся в переменной «справа», которая перемещается для регистрации EBX. Меня попросят найти общую и положительную разницу от двух значений выше, а затем сохранить общее значение и положительное значение разницы в 2 разных регистрах (соответственно ECX и EDX).
Я уже нашел общее использование инструкции ADD только для поиска. Однако, когда я делаю положительную разницу, используя инструкцию SUB, все, что я получаю, это «левое» значение или отрицательная разница. Ниже приведен код:
mov eax,left ;// get first 3 digits
call DumpRegs ;// DumpReg to display the contents of the register
mov ebx,right ;// get last 4 digits
call DumpRegs
add eax, ebx ;// add both values together
call DumpRegs
mov total,eax
call DumpRegs
mov ecx,total
call DumpRegs
mov eax,left
call DumpRegs
call WriteInt
mov eax,left
call DumpRegs
call WriteInt
mov ebx,right
call DumpRegs
sub ebx,eax
mov diff,ebx
mov edx,diff
mov ebx,right
call DumpRegs
Например, если мой ученик идентификатор 1234567, то левая 123 и 4567 прав. Таким образом, eax будет 123, а ebx - 4567. Общее количество eax и ebx будет записано в «total», которое зарегистрировано в ecx. Тогда положительная разница я по моему коду 123. Если я переключаю
sub ebx,eax
в
sub eax,ebx
тогда я получаю отрицательное значение. Я не могу понять, почему sub показывает только левое значение.
Edit: это содержание регистров после каждой команды
EAX=000000F2 EBX=7F0EF000 ECX=012A1055 EDX=012A1055
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A352A EFL=00000246 CF=0 SF=0 ZF=1 OF=0 AF=0 PF=1
EAX=000000F2 EBX=00001860 ECX=012A1055 EDX=012A1055
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A3535 EFL=00000246 CF=0 SF=0 ZF=1 OF=0 AF=0 PF=1
EAX=00001952 EBX=00001860 ECX=012A1055 EDX=012A1055
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A353C EFL=00000202 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=0
EAX=00001952 EBX=00001860 ECX=012A1055 EDX=012A1055
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A3546 EFL=00000202 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=0
+6482
EAX=00001952 EBX=00001860 ECX=00001952 EDX=012A1055
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A3556 EFL=00000202 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=0
EAX=000000F2 EBX=00001860 ECX=00001952 EDX=012A1055
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A3560 EFL=00000202 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=0
+242
EAX=000000F2 EBX=00001860 ECX=00001952 EDX=012A1055
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A356F EFL=00000202 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=0
+242
EAX=000000F2 EBX=00001860 ECX=00001952 EDX=012A1055
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A357F EFL=00000202 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=0
+242
EAX=000000F2 EBX=00001860 ECX=00001952 EDX=0000176E
ESI=012A1055 EDI=012A1055 EBP=006BFC54 ESP=006BFC44
EIP=012A359D EFL=00000202 CF=0 SF=0 ZF=0 OF=0 AF=0 PF=0
Hello world!☺Press any key to continue . . .
Выглядит правильно, в чем проблема? Обратите внимание, что в последнем дампе 'diff' находится в' edx', и это похоже на '0x1860 (ebx, right) - 0xf2 (eax, left)'. Также 'ecx' имеет правильное' total'. – Jester
проблема положительного вычитания. Он должен был дать 5998 (мой ID - 2426240), но это не так. Вместо этого он выдал левое значение (242), хотя я вычитаю левое (242) значение справа (6240) – Nathan
Вы никогда его не печатаете, это только в дампе. 'edx' имеет' 0x176E', который ** является ** '5998'. Нет никакого вызова 'WriteInt' для' diff' в любом месте. Последний вызов 'WriteInt' в вашем коде, как показано, ** перед ** вычитанием и будет просто напечатать' left'. – Jester