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

Объяснение кода листинга программы

  1. Устанавливается модель кода tiny, pascal и точка входа программы begin
  2. В переменную si загружается значение 10
  3. В регистр ah загружается значение 3Ch
  4. Регистр cx обнуляется
  5. Адрес переменной dbName загружается в регистр dx
  6. Вызывается прерывание 21h для открытия файла
  7. Если произошла ошибка при открытии файла, то программа переходит на метку @@02
  8. Иначе, в переменную dwHndl загружается значение, полученное в результате открытия файла
  9. В регистр cx загружается значение 9000, в ax - 1000
  10. Адрес переменной dbStr загружается в регистр di
  11. Вызывается процедура Check
  12. Если процедура вернула значение carry flag (CF), программа переходит на метку @@01
  13. Иначе, увеличивается значение переменной ax и происходит повторение цикла @@00
  14. Производится запись результата в файл
  15. Программа возращается по адресу @@02
  16. Процедура завершается В этой программе происходит открытие файла, где в файле 170522.txt хранятся четырёхзначные числа. После открытия файла происходит проверка чисел, удовлетворяющих некоторому условию, и результат записывается в файл.

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы