Из записи натурального числа 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д