首页 文章

汇编语言中的算术运算

提问于
浏览
1

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

我的学生ID有7位数字,3个最高有效数字存储在移动到寄存器EAX的变量“left”中,4个最低有效数字存储在移动到寄存器EBX的变量“right”中 . 我被要求从上面的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 回答

  • 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 电话的输出 .

相关问题