assembly 在程序集x86中添加2个数字

bcs8qyzn  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(140)

当你试着把两个数字相加时,它会显示一个字母或一个符号。

.plus:
                mov eax, [num1]
                sub eax, 0
                mov ebx, [num2]
                sub ebx, 0
                add eax, ebx
                sub eax, 0
                mov [num3], eax
                jmp .result

字符串
我本来想在1 + 1处写2,但上面写的是b。

6qftjkof

6qftjkof1#

当你输入1时,你的程序接收到49,这是属于字符“1”的ASCII码。不知何故,你已经知道你必须把这个字符代码转换成十进制数字的值。减去48(49和1之间的差异)是有序的,但遗憾的是,您编写了sub eax, 0,而不是所需的sub eax, 48,我们更喜欢使用单引号将其写成sub eax, '0'
由于上述原因,add eax, ebx的总和计算为49 + 49,产生98,这恰好是小写字母字符'b'的ASCII。
从ASCII到数字[0,9]的转换需要减去48,而从数字[0,9]到字符的转换需要加上48。您也错误地使用了减法!

movzx eax, byte [num1]  ; ['0','9']
sub   eax, '0'          ; -> [0,9]
movzx ebx, byte [num2]  ; ['0','9']
sub   ebx, '0'          ; -> [0,9]
add   eax, ebx          ; -> [0,9] hopefully ?
add   eax, '0'          ; -> ['0','9']
mov   [num3], al        ; ['0','9']

字符串
最后的add eax, '0'转换只有在加法产生范围[0,9]内的和时才是正确的。显然,如果和大于9,则必须处理范围[10,18]内的2位数结果。

相关问题