Найти все четырёхзначные числа, удовлетворяющие условию - Assembler
Формулировка задачи:
Народ, нужна помощь! Задача такая.
Найти все четырёхзначные десятичные числа, у которых сумма первых двух цифр в два раза больше суммы правых двух цифр. Результат вывести в файл.
Я сделал программу с выводом на экран, но не получается переделать под файл, если кто может помогите, пожалуйста исправить программу, чтобы результат выводился в файл.
Так как я только начинаю изучать, поэтому может чего-то не понимаю.
.MODEL tiny; !!!! .486p .data thousand dw 1000 hund db 100 ten db 10 S db ? car db ' ', '$' .code assume cs:@code, ds:@code, es: @code, ss: @code org 100h start: mov bx, 1000 mov cx, 9000 my_loop: mov ax, bx div hund ; al - частное, т.е., 2 левые цифры push ax xor ah, ah div ten add al, ah mov S, al ; в S - сумма двух крайних цифр слева pop ax ; ah - остаток, т.е., 2 правые цифры mov al, ah xor ah, ah div ten add al, ah add al, al cmp al, S jne next mov ax, bx ; Печатаем текущее число (print_n у меня печатает содержимое AX) call print_n mov ah, 09h mov dx, offset car int 21h next: inc bx loop my_loop mov ah,0 int 16h mov ah,4ch int 21h print_n proc near ; процедура вывода числа от 0 до 9999, передаваемого через стек в десятичной форме push bp ; Все регистры сохраняются mov bp, sp ; Принимает один аргумент (число) размером в слово push ax push cx push dx ;mov ax, [bp+4] ; адрес этого числа в стеке для ближней модели (near) ; для дальней модели (far) заменить 4 на 6 cmp ax, 1000 jb short @@p100 mov dx, 0 mov cx,1000 div cx ; в ax - частное, в dx - остаток push dx ; Запоминаем остаток для дальнейшего mov dl, al mov ah, 02h ; вывод тысяч, если они есть add dl, 30h ; символ цифры в регистре int 21h pop ax ; восстанавливаем остаток в ax jmp short @@p101 ; обходим ненужное сравнение @@p100: cmp ax, 100 jb short @@p10 @@p101: mov cl,100 div cl ; Частное от деления на 100 в al, остаток в ah push ax mov dl, al add dl, 30h mov ah, 02h ; Вывод сотен, если они есть int 21h pop ax mov al, ah xor ah, ah jmp @@p11 ; обходим сравнение с 10 @@p10: ; (будет правильно при отсутствии десятков) cmp al, 10 jb short @@p0 @@p11: mov cl, 10 div cl ; Частное от деления на 10 в al, остаток в ah push ax mov dl, al add dl, 30h mov ah, 02h ; Вывод десятков, если они есть int 21h pop ax mov al, ah @@p0: mov ah, 02h ; Вывод единиц mov dl,al add dl, 30h int 21h pop dx pop cx pop ax mov sp, bp ; Восстановление указателя стека к моменту входа pop bp ret 0 ; очистка стека print_n endp end start
Решение задачи: «Найти все четырёхзначные числа, удовлетворяющие условию»
textual
Листинг программы
model tiny,pascal .code org 100h begin: mov si,10 mov ah,3Ch xor cx,cx lea dx,dbName int 21h jc @@02 mov dwHndl,ax mov cx,9000 mov ax,1000 lea di,dbStr @@00: call Check jc @@01 inc ax loop @@00 @@01: mov ah,3Eh lea bx,dwHndl int 21h @@02: ret dbStr db 4 dup(?),' ' Check proc uses ax,bx,cx,di mov cx,2 Chek: call Numb xchg bh,bl loop Chek shl bh,1 xor bl,bh jnz Exit mov ah,40h mov bx,dwHndl mov cx,5 lea dx,dbStr int 21h Exit: ret Check endp dwHndl dw ? dbName db '170522.txt',0 Numb proc uses cx mov cx,2 @@03: xor dx,dx div si add bx,dx or dl,'0' mov [di],dl inc di loop @@03 ret Numb endp end begin
Объяснение кода листинга программы
- Устанавливается модель кода
tiny, pascal
и точка входа программыbegin
- В переменную
si
загружается значение 10 - В регистр
ah
загружается значение 3Ch - Регистр
cx
обнуляется - Адрес переменной
dbName
загружается в регистрdx
- Вызывается прерывание 21h для открытия файла
- Если произошла ошибка при открытии файла, то программа переходит на метку @@02
- Иначе, в переменную
dwHndl
загружается значение, полученное в результате открытия файла - В регистр
cx
загружается значение 9000, вax
- 1000 - Адрес переменной
dbStr
загружается в регистрdi
- Вызывается процедура
Check
- Если процедура вернула значение
carry flag
(CF), программа переходит на метку @@01 - Иначе, увеличивается значение переменной
ax
и происходит повторение цикла @@00 - Производится запись результата в файл
- Программа возращается по адресу @@02
- Процедура завершается
В этой программе происходит открытие файла, где в файле
170522.txt
хранятся четырёхзначные числа. После открытия файла происходит проверка чисел, удовлетворяющих некоторому условию, и результат записывается в файл.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д