汇编语言中的算术运算
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
调用的输出。
我正在学习汇编语言 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
调用的输出。