Есть небольшой код для NASM, в котором для вводимых переменных производятся некоторые операции: (x+1)/y.
Проблема в том, что после деления попытка вывести из регистра значение частного/остатка заканчивается выводом козяблика.
Я не понимаю, почему он ведет себя именно так даже для простых значений (х,у = 3,2). Собственно, в этом суть, чтобы оно работало хотя бы для таких небольших значений.
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
section .data
inp1msg db "enter x:", 0xA,0xD
len1 equ $- inp1msg
inp2msg db "enter y:", 0xA,0xD
len2 equ $- inp2msg
outmsg db "result:"
len3 equ $- outmsg
section .bss
x resb 8
y resb 8
z resb 8
section .text
global _start
_start:
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, inp1msg
mov edx, len1
int 0x80
mov eax, SYS_READ ;вводим x
mov ebx, STDIN
mov ecx, x
mov edx, 8
int 0x80
mov eax, SYS_WRITE;вводим у
mov ebx, STDOUT
mov ecx, inp2msg
mov edx, len2
int 0x80
mov eax, SYS_READ
mov ebx, STDIN
mov ecx, y
mov edx, 8
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, outmsg
mov edx, len3
int 0x80
;перемещаем переменные x y в ax bx соответственно
mov ax, [x]
mov bx, [y]
;1 x+1 (увеличиваем x на 1)
inc ax
;2 (x+1)/y делим на у, все проблемы начинаются отсюда
div bx
mov [z], ax
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, z
mov edx, 1
int 0x80
exit:
mov eax, SYS_EXIT
xor ebx, ebx
int 0x80
Выводится следующее:
enter x:
3
enter y:
2
result:�
Если закомментировать деление, то вывод результата х+1 будет нормальным:
enter x:
3
enter y:
2
result:4
То есть это проблема в самом делении. Вывод регистров al (как и ax в первом сниппете) тоже дает козяблину, ah выводит пустоту:
enter x:
3
enter y:
2
result:�
enter x:
3
enter y:
2
result: