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