汇编语言中的算术运算

Arithmetic Operations in Assembly language

我正在学习汇编语言 class 并有一个项目,但我有点卡住了,找不到代码中的错误。该项目要求我根据从我的学生 ID 除的 2 个值编写几个基本算术运算(加法和减法)。

我的学生 ID 有 7 位数字,最高 3 位存储在变量 "left" 中,已移动到寄存器 EAX,最低 4 位存储在变量 "right" 中,已移动注册 EBX。我被要求找到上面 2 个值的总差和正差,然后将总值和正差值存储到 2 个不同的寄存器(分别为 ECX 和 EDX)。

刚才用ADD指令已经找到了总数。但是,当我使用 SUB 指令执行正差时,我得到的只是 "left" 值或负差。下面是代码:

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只显示左边的值

编辑:这是每条指令后寄存器的内容

  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 . . .

运行 此代码:

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 调用的输出。