У меня есть следующий код:
extern printf
section .data
A db 1
B db 2
C db 3
D db 4
E db 5
fmt db "%d",10,0
fmt2 db "An overflow has occured",10,0
section .text
global _start
_start:
xor rax, rax
xor rbx, rbx
xor rdx, rdx
xor ax, ax
mov al, [B]
mul ax
jo over
call printax
mov bx, ax
xor ax, ax
mov al, [C]
mul ax
jo over
call printax
xor cx, cx
mov cl, [C]
mul cx
jo over
call printax
xor cx, cx
mov cl, [E]
div cx
jo over
call printax
xor dx, dx
xor al, al
mov rdi, fmt
call printf
jmp exit
over:
mov rdi, fmt2
xor al, al
call printf
exit:
mov rax, 60
mov rdi, 0
syscall
printbx:
xor rsi, rsi
mov si, bx
mov cl, al
xor al, al
mov rdi, fmt
call printf
mov al, cl
xor si, si
ret
printax:
xor rsi, rsi
mov si, ax
xor al, al
mov rdi, fmt
call printf
mov ax, si
xor si, si
ret
Я компилирую его с помощью nasm -f elf64 1.asm
и связываю его с помощью ld -dynamic-linker /lib/ld-linux-x86-64.so.2 1.o -o 1 -lc
. Когда я выполняю двоичный файл, я получаю
$ ./1
4
9
0
Floating point exception (core dumped)
printf()
, который не всегда терпит неудачу, когда я вызываю его в коде сборки.
Удаление printf()
вызовов из printax
и printbx
дает мне
$ ./1
0
Обновление: исключение также исчезает, если я удаляю строку div cx
. Затем я получаю следующий вывод:
$./1
4
9
0
0
0
Но он не исчезает, даже если я добавлю
mov cx, 1
mov ax, 1
до div cx
.