Из записи натурального числа N выбросить все цифры, кратные заданной - Assembler

Узнай цену своей работы

Формулировка задачи:

Вот такая вот задача. Из записи натурального числа N выбросить все цифры, кратные заданной, оставив прежним порядок остальных цифр. С языком еще не очень знакома, можете подсказать хотя бы принцип и последовательность действий, при помощи которых можно решить эту задачу. А то совсем никаких идей нет. Заранее благодарна.

Решение задачи: «Из записи натурального числа N выбросить все цифры, кратные заданной»

textual
Листинг программы
  1. org 100h
  2. jmp start
  3.  
  4. mes0   db  13,10,'Default digit: F9A3h'
  5.        db  13,10,'Binary codes : 1111 1001 1010 0011b'
  6.        db  13,10,'Type constant: $'
  7. ress   db  13,10,'       Result: $'
  8. digit  dw  0F9A3h
  9. const  db  0
  10.  
  11. start:
  12.     mov   dx,mes0         ;
  13.     call  message         ;
  14.     mov   ah,8            ; вводим константу
  15. @@: int   21h             ;
  16.     cmp   al,'0'          ; игнорируем всё,
  17.     jb    @b              ;     ..кроме цифр 0..9
  18.     cmp   al,'9'          ;
  19.     ja    @b              ;
  20.     int   29h             ;
  21.     and   ax,0Fh          ; переводим символ в цифру,
  22.     push  ax              ;     ..и запоминаем её
  23.     mov   dx,ress         ;
  24.     call  message         ;
  25.  
  26.     pop   bx              ; ВХ = константа (делитель)
  27.     xor   ax,ax           ; АХ будет результат (пока очищаем)
  28.     mov   si,[digit]      ; натуральное число
  29.     mov   cx,4            ; кол-во цифр в числе
  30. @@: shld  ax,si,4         ; см.описание выше!
  31.     push  ax              ; запомним АХ
  32.     and   ax,0Fh          ; оставляем только мл.тетраду числа
  33.     cwd                   ; очищаем место под остаток (DX=0)
  34.     div   bx              ; разделить АХ на ВХ
  35.     pop   ax              ; восстановим число
  36.     or    dx,dx           ; в DX есть остаток?
  37.     jnz   ok              ; есть - пропускаем тетраду в приёмник
  38.     shr   ax,4            ; иначе: удаляем её от туда
  39. ok: rol   si,4            ; сдвинем на 4 влево источник (сл.тетрада для проверки)
  40.     loop  @b              ; проверяем оставшиеся цифры..
  41.                           ; в АХ у нас результат! ==============================
  42.     call  hexOut          ;      ..выводим его на экран
  43.     mov   al,'h'          ; вставляем в конец литер "hex"
  44.     int   29h             ;
  45.  
  46. exit:                     ;
  47.     xor   ax,ax           ;
  48.     int   16h             ;
  49.     int   20h             ; выход!
  50.  
  51. ;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  52. message:                  ;
  53.    mov   ah,9             ;
  54.    int   21h              ;
  55. ret                       ;
  56. ;-----------------------------------------------------------------------
  57. ; процедура выводит EАХ на экран в HEX
  58. hexOut:                   ;
  59.    pusha                  ;
  60.    xchg  dx,ax            ; DX = число
  61.    mov   cx,4             ; кол-во цифр для вывода
  62. @@:                       ;
  63.    shld  ax,dx,4          ; получить в AL очередную цифру
  64.    rol   dx,4             ; удалить ее из DX
  65.    and   al,0Fh           ; оставить в AL только эту цифру
  66.    cmp   al,0Ah           ; три команды, переводящие
  67.    sbb   al,69h           ;    ..шестнадцатеричную цифру из AL
  68.    das                    ;         ..в соответствующий ASCII-код
  69.    int   29h              ; вывод на экран
  70.    loop  @b               ; повторить для всех цифр
  71.    popa                   ;
  72. ret                       ;

Объяснение кода листинга программы

org 100h jmp start mes0 db 13,10,'Default digit: F9A3h' db 13,10,'Binary codes : 1111 1001 1010 0011b' db 13,10,'Type constant: $' db 13,10,'Result: $' digit dw 0F9A3h const db 0 start: mov dx,mes0 call message mov ah,8 int 21h cmp al,'0' jb @b cmp al,'9' ja @b int 29h and ax,0Fh push ax mov dx,ress call message pop bx xor ax,ax mov si,[digit] mov cx,4 shld ax,si,4 push ax and ax,0Fh cwd div bx pop ax or dx,dx jnz ok shr ax,4 rol si,4 loop @b call hexOut mov al,'h' int 29h exit: xor ax,ax int 16h int 20h message: mov ah,9 int 21h ret hexOut: pusha xchg dx,ax mov cx,4 @@: shld ax,dx,4 rol dx,4 and al,0Fh cmp al,0Ah sbb al,69h das int 29h loop @b popa ret

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы