Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 18:48   #1
studier
Новичок
Джуниор
 
Регистрация: 14.12.2010
Сообщений: 2
Печаль вычитание на л.установке

Программа вычитает из пятизначного числа двузначное, но, ввод осуществляется некорректно, т.е если ввести из 50000 вычесть 10, получим:
00005
***01
00004, для того чтобы посчитать 50000-10, надо вводить числа наоборот, т.е 00005 - 01, тогда получим на экране установки:
50000
***10
49990
Вот код программы:
Код:
      .MODEL Tiny

      .CODE
      ORG 100H
      dig_num1 EQU 5
      dig_num2 EQU 2

      begin:
         call clear_display
         mov cx, dig_num1
         xor bx, bx
      read_fst_arg:
         call read_digit
         mov fst_arg[bx], al
         call write_digit
         inc bx
         loop read_fst_arg
         call wait_for_key
         call clear_display
         mov cx, dig_num2
         xor bx, bx
      read_scd_arg:
         call read_digit
         mov scd_arg[bx], al
         call write_digit
         inc bx
         loop read_scd_arg
       
         call wait_for_key
       
         mov cx, dig_num1-1
         xor bx, bx
         mov al, fst_arg[bx]
         sub al, scd_arg[bx]
         aas
         pushf
         call write_digit
         inc bx
      solve:
         popf
         mov al, fst_arg[bx]
         sbb al, scd_arg[bx]
         aas
         pushf
         call write_digit
         inc bx
         loop solve
         popf
       
         call wait_for_key
         jmp begin
       
       clear_display PROC
         push ax
       
         mov dx, 0FFEAH
         mov al, 10010000b
         out dx, al
         mov cx, 8
         mov dx, 0FFE8H
         xor al, al
      clr_loop:
         out dx, al
         loop clr_loop
       
         pop ax
         ret
      ENDP
       
       read_digit PROC
         push cx
      read_again1:
         mov dx, 0FFEAH
         in al, dx
         and al, 00001111b
         jz read_again1
       
         mov al, 01000000b
         out dx, al
         mov dx, 0FFE8H
         in al, dx
         xor cl, cl
         test al, 00001000b
         jz is_digit
         test al, 00000110b
         jnz read_again1
         mov cl, 8
      is_digit:
         and al, 00000111b
         add al, cl
         pop cx
         ret
      ENDP
       
       wait_for_key PROC
      read_again2:
         mov dx, 0FFEAH
         in al, dx
         and al, 00001111b
         jz read_again2
         mov al, 01000000b
         out dx, al
         mov dx, 0FFE8H
         in al, dx
         ret
      ENDP
       
       write_digit PROC
         mov dx, 0FFEAH
         push ax
         mov al, bl
         or al, 10000000b
         out dx, al
         pop ax
         push bx
         mov bl, al
         mov al, dig[bx]
         pop bx
         mov dx, 0FFE8H
         out dx, al
         ret
      dig DB 00111111b,00000110b,01011011b,01001111b,01100110b,01101101b,01111101b,00000111b,01111111b,01101111b
      ENDP
      fst_arg DB dig_num1 DUP (0)
      scd_arg DB dig_num1 DUP (0)
       
      END begin
studier вне форума Ответить с цитированием
Старый 14.12.2010, 18:48   #2
studier
Новичок
Джуниор
 
Регистрация: 14.12.2010
Сообщений: 2
Вопрос

Я переделала ввод двух чисел, чтобы вводилось с 4 по 0 ячейки и с 1 по 0, слева направо как положено, уменьшая каждый раз bx, а не увеличивая, как в предыдущий раз.
Код:
      .MODEL Tiny
       
      .CODE
      ORG 100H
      dig_num1 EQU 5
      dig_num2 EQU 2
       
      begin:
         call clear_display
         mov cx, dig_num1
         mov bx,4
      read_fst_arg:
         call read_digit
         mov fst_arg[bx], al
         call write_digit
         dec bx
         loop read_fst_arg
       
         call wait_for_key
       
         call clear_display
         mov cx, dig_num2
         mov bx,1
      read_scd_arg:
         call read_digit
         mov scd_arg[bx], al
         call write_digit
         dec bx
         loop read_scd_arg
       
         call wait_for_key
       
         mov cx, dig_num1-1
         xor bx, bx
         mov al, fst_arg[bx]
         sub al, scd_arg[bx]
         aas
         pushf
         call write_digit
         inc bx
      solve:
         popf
         mov al, fst_arg[bx]
         sbb al, scd_arg[bx]
         aas
         pushf
         call write_digit
         inc bx
         loop solve
         popf
       
         call wait_for_key
         jmp begin
       
       clear_display PROC
         push ax
       
         mov dx, 0FFEAH
         mov al, 10010000b
         out dx, al
         mov cx, 8
         mov dx, 0FFE8H
         xor al, al
      clr_loop:
         out dx, al
         loop clr_loop
       
         pop ax
         ret
      ENDP
       
       read_digit PROC
         push cx
      read_again1:
         mov dx, 0FFEAH
         in al, dx
         and al, 00001111b
         jz read_again1
       
         mov al, 01000000b
         out dx, al
         mov dx, 0FFE8H
         in al, dx
         xor cl, cl
         test al, 00001000b
         jz is_digit
         test al, 00000110b
         jnz read_again1
         mov cl, 8
      is_digit:
         and al, 00000111b
         add al, cl
         pop cx
         ret
      ENDP
       
       wait_for_key PROC
      read_again2:
         mov dx, 0FFEAH
         in al, dx
         and al, 00001111b
         jz read_again2
         mov al, 01000000b
         out dx, al
         mov dx, 0FFE8H
         in al, dx
         ret
      ENDP
       
       write_digit PROC
         mov dx, 0FFEAH
         push ax
         mov al, bl
         or al, 10000000b
         out dx, al
         pop ax
         push bx
         mov bl, al
         mov al, dig[bx]
         pop bx
         mov dx, 0FFE8H
         out dx, al
         ret
      dig DB 00111111b,00000110b,01011011b,01001111b,01100110b,01101101b,01111101b,00000111b,01111111b,01101111b
      ENDP
      fst_arg DB dig_num1 DUP (0)
      scd_arg DB dig_num1 DUP (0)
       
      END begin
Всё бы хорошо, но перестал работать вывод результата, вообще ничего не выводит =(
Помогите пожалуйста исправить вывод результата, ведь он работал, пока ввод чисел не был сделан как положено слева направо, начиная с 4 и 1 ячейки для 5-го и 2-го чисел соответственно. Буду Вам очень благодарна за помощь.
studier вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычитание данных из dbGrid grafgrial Общие вопросы Delphi 0 08.10.2010 23:00
Вычитание и LOOP lordus Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 14.11.2009 17:20
Вычитание avnsanto Microsoft Office Excel 0 24.07.2009 02:33
Вычитание чисел по основанию 4 и 16. Stager Общие вопросы C/C++ 1 21.01.2009 00:13
вычитание даты zetrix Microsoft Office Excel 3 10.11.2006 06:30