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