DIV в NASM всегда возвращают 1 - PullRequest
0 голосов

Есть мой весь код:

SYS_EXIT  equ 1
SYS_READ  equ 3
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1

section .data 

   msg1 db `\xF0\x9F\x98\x8E`, " Enter the A: "
   len1 equ $- msg1 

   msg2 db `\xF0\x9F\x98\x89`, " Than the B: "
   len2 equ $- msg2

   msg3 db `\xF0\x9F\x8D\xB0`, " A > B:   A / B - 1 = "
   len3 equ $- msg3

   msg4 db `\xF0\x9F\x8D\xAA`, " A = B: -25"
   len4 equ $- msg4

   msg5 db `\xF0\x9F\x8D\x95`, " A < B: (B^3 - 5) / A = "
   len5 equ $- msg5


section .bss

   a resb 32
   b resb 32
   x resb 32

section .text
   global _start    ;must be declared for using gcc

_start:             ;tell linker entry point
   mov eax, SYS_WRITE
   mov ebx, STDOUT
   mov ecx, msg1
   mov edx, len1
   int 0x80

   mov eax, SYS_READ
   mov ebx, STDIN
   mov ecx, a
   mov edx, 32
   int 0x80

   mov eax, SYS_WRITE
   mov ebx, STDOUT
   mov ecx, msg2
   mov edx, len2
   int 0x80

   mov eax, SYS_READ
   mov ebx, STDIN
   mov ecx, b
   mov edx, 32
   int 0x80

   ; Comparing
   mov eax, [a]
      sub eax, '0'
   mov ecx, [b]
      sub ecx, '0'

   cmp eax, ecx
   jg Ab          ;A grate than b
   je AB          ;A and B are equal
   jl aB          ;a smoller than B

   Ab:
      cdq
      idiv ecx
      dec eax

      add eax, '0'
      mov [x], eax

      mov eax, SYS_WRITE
      mov ebx, STDOUT
      mov ecx, msg3
      mov edx, len3
      int 0x80

      mov eax, SYS_WRITE
      mov ebx, STDOUT
      mov ecx, x
      mov edx, 32
      int 0x80
      jmp exit    ;go to exit

   AB:
      mov eax, SYS_WRITE        
      mov ebx, STDOUT         
      mov ecx, msg4
      mov edx, len4
      int 0x80
      jmp exit    ;go to exit

   aB:
      mov eax, ecx
      imul ecx
      imul ecx
         mov ebx, '5'
            sub ebx, '0'
      sub eax, ebx

      mov ecx, [a]
         sub ecx, '0'
      idiv ecx

      add eax, '0'
      mov [x], eax

      mov eax, SYS_WRITE
      mov ebx, STDOUT
      mov ecx, msg5
      mov edx, len5
      int 0x80

      mov eax, SYS_WRITE
      mov ebx, STDOUT
      mov ecx, x
      mov edx, 1
      int 0x80

exit:    

   mov eax, SYS_EXIT   
   xor ebx, ebx 
   int 0x80

В 'a' и 'b' я помещаю разные числа от 0 до 9, но эта операция всегда возвращает 1. Я извлек EDX и заметил, что процессор вычитает ECX из EAX только один раз. В EAX он пишет 1, а в EDX - остаток от вычитания EAX и ECX.

Когда я ввожу a = 9 и b = 4: EAX после деления = 1 и EDX = 5. Если я ввожу a = 6 и b = 2: EAX = 1, EDX = 4

Что случилось?

1 Ответ

0 голосов

Предположительно, после каждой цифры стоит символ новой строки (0xA). В итоге вы делите 0xA09 на 0xA04. Вы могли бы, например, используйте movzx eax, byte [a] вместо этого (и аналогично для b).

...