@EEElice

Не понимаю, что происходит внутри регистра после DIV. «Регистры ломаются»?

Есть небольшой код для 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:
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
@galaxy
Числа из read() приходит в виде строк - последовательности ASCII кодов. Для 2 и 3 это будет 0x32 и 0x33 соответственно (я уже забыл, честно говоря, придут ли они вместе с "\n" или нет).
Короче, вы делите ASCII-коды.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы