2016-02-22 4 views
1

Я беру класс ассемблерного языка и имею проект, но я немного застрял и не могу найти, что не так в моем коде. Проект просит меня написать пару основных арифметических операций (сложение и вычитание) на основе двух значений, которые делятся на мой идентификатор студента.Арифметические операции в языке ассемблера

Мой идентификатор студента имеет 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 . . . 
+0

Выглядит правильно, в чем проблема? Обратите внимание, что в последнем дампе 'diff' находится в' edx', и это похоже на '0x1860 (ebx, right) - 0xf2 (eax, left)'. Также 'ecx' имеет правильное' total'. – Jester

+0

проблема положительного вычитания. Он должен был дать 5998 (мой ID - 2426240), но это не так. Вместо этого он выдал левое значение (242), хотя я вычитаю левое (242) значение справа (6240) – Nathan

+0

Вы никогда его не печатаете, это только в дампе. 'edx' имеет' 0x176E', который ** является ** '5998'. Нет никакого вызова 'WriteInt' для' diff' в любом месте. Последний вызов 'WriteInt' в вашем коде, как показано, ** перед ** вычитанием и будет просто напечатать' left'. – Jester

ответ

1

Запуск этого кода:

mov left, 123 
mov right, 4567 

mov eax,left 
call DumpRegs 
call WriteInt 
mov ebx,right 
call DumpRegs   
sub ebx,eax 
mov diff,ebx 

Правильно производит положительную разницу 4444. Если это не для вас, отредактируйте свой вопрос, чтобы он включал вывод всех этих вызовов DumpRegs.

+0

Я забыл сказать вам, что я уже назначил значения слева и справа, поэтому нет необходимости повторно назначать их, правильно? – Nathan

+0

Да, я просто показал, как выглядит (почти) MCVE. Это дает правильный результат. – Jester

+0

сообщение обновляется с выходами вызова DumpRegs. Вычитание не дает положительной разницы, вместо этого оно дает левое значение. – Nathan