Из записи натурального числа N выбросить все цифры, кратные заданной - Assembler
Формулировка задачи:
Решение задачи: «Из записи натурального числа N выбросить все цифры, кратные заданной»
- 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д