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

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

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

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

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

textual
Листинг программы
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: $'
ress   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              ;     ..кроме цифр 0..9
    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                   ; очищаем место под остаток (DX=0)
    div   bx              ; разделить АХ на ВХ
    pop   ax              ; восстановим число
    or    dx,dx           ; в DX есть остаток?
    jnz   ok              ; есть - пропускаем тетраду в приёмник
    shr   ax,4            ; иначе: удаляем её от туда
ok: rol   si,4            ; сдвинем на 4 влево источник (сл.тетрада для проверки)
    loop  @b              ; проверяем оставшиеся цифры..
                          ; в АХ у нас результат! ==============================
    call  hexOut          ;      ..выводим его на экран
    mov   al,'h'          ; вставляем в конец литер "hex"
    int   29h             ;
 
exit:                     ;
    xor   ax,ax           ;
    int   16h             ;
    int   20h             ; выход!
 
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
message:                  ;
   mov   ah,9             ;
   int   21h              ;
ret                       ;
;-----------------------------------------------------------------------
; процедура выводит EАХ на экран в HEX
hexOut:                   ;
   pusha                  ;
   xchg  dx,ax            ; DX = число
   mov   cx,4             ; кол-во цифр для вывода
@@:                       ;
   shld  ax,dx,4          ; получить в AL очередную цифру
   rol   dx,4             ; удалить ее из DX
   and   al,0Fh           ; оставить в AL только эту цифру
   cmp   al,0Ah           ; три команды, переводящие
   sbb   al,69h           ;    ..шестнадцатеричную цифру из AL
   das                    ;         ..в соответствующий ASCII-код
   int   29h              ; вывод на экран
   loop  @b               ; повторить для всех цифр
   popa                   ;
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
Похожие ответы