汇编语言中的算术运算

时间:2016-02-22 23:11:20

标签: assembly x86 masm

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

我的学生ID有7位数字,3位最高位数字存储在变量" left"移动到寄存器EAX,4个最低有效数字存储在变量"右"移动到注册EBX。我要求从上面的2个值中找出总和正差,然后将总值和正差值存储到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

例如,如果我的学生ID是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 . . .

1 个答案:

答案 0 :(得分: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次来电的输出。