gpt4 book ai didi

linux - 在汇编中进行除法时出现浮点异常(核心已转储)

转载 作者:太空宇宙 更新时间:2023-11-04 11:22:29 32 4
gpt4 key购买 nike

我正在尝试将 2 个两位数相加,它们必然会产生一个两位数或三位数。

这是我目前的情况,当我尝试打印进位时,它显示浮点异常(核心已转储)

section .data
msg db "Enter 2 numbers: "
msgLen equ $-msg

section .bss
numa1 resb 1
numa2 resb 1
numb1 resb 1
numb2 resb 1
carry resb 1

section .text
global _start

_start:
;print message
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, msgLen
int 80h

;accept first number (1st digit)
mov eax, 3
mov ebx, 0
mov ecx, numa1
mov edx, 1
int 80h

;accept first number (2nd digit)
mov eax, 3
mov ebx, 0
mov ecx, numa2
mov edx, 2
int 80h

;accept second number (1st digit)
mov eax, 3
mov ebx, 0
mov ecx, numb1
mov edx, 1
int 80h

;accept second number (2nd digit)
mov eax, 3
mov ebx, 0
mov ecx, numb2
mov edx, 2
int 80h

;character to number conversion
sub byte[numa1], 30h
sub byte[numa2], 30h
sub byte[numb1], 30h
sub byte[numb2], 30h
sub byte[carry], 30h

;;;;;;;;;;;;;;;;;;;;;;;;;;

;add ones digit
mov al, [numa2]
add byte[numb2], al
add byte[numb2], 30h

;get carry of sum of ones digit
mov ax, [numb2]
mov byte[carry], 10
div byte[carry]

mov eax, 4
mov ebx, 1
mov ecx, carry
mov edx, 1
int 80h


mov eax, 1
mov ebx, 0
int 80h

  carry
numa1 numa2
+ numb2 numb2
---------------
numb2

where numb2 = numb2 % 10
carry = numb2 / 10

最佳答案

首先,xor ebx, ebx is shorter and faster than mov ebx, 0

另外,两个一位数相加的结果是最大进位为 1(9 + 9 = 18),因此无需除法,只需将数字减去 10 即可。此外,您通常应该避免使用 16 位寄存器,它既更长(由于 66h 前缀)又更慢(因为部分寄存器更新)。这意味着

mov ax, [numb2]
mov byte[carry], 10
div byte[carry]

会比下面慢很多

movzx eax, word ptr [numb2]
sub eax, 10

但毕竟x86已经有了BCD instructions,为什么还要用这么复杂的方式?为了这个目的。此外,这些指令有 AF 和 CF 用于 BCD 数学进位,因此无需您自己管理它

您也可以直接使用二进制数学并在输入/输出处转换它们。大多数情况下,转换成本可以忽略不计

关于linux - 在汇编中进行除法时出现浮点异常(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17267472/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com