Автор: Qwezar
Дата сообщения: 04.01.2007 16:07
Люди, помогите плиз, эта прога ищет все полиндромы до 5000 нужно их вывести на экран и в файл, с экраном все ОК, а вот с файлом проблема, создается пкстой txt и все.
Код:
MODEL TINY
.486
.CODE
assume cs:@code,ds:@code,es:@code,ss:@code
org 100h
begin:
mov ah,3ch ;Создание файла
mov cx,0 ;Для записи и чтения
mov dx,offset fn
mov bx,fnd
int 21h
mov fnd,ax
mov word ptr count,0
;до 10
mov eax,-1
p1:
inc eax
push eax
inc count
call print_n pascal,eax,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,2h
mov dl,32
int 21h
pop eax
cmp eax,9
jb p1
;двузначные
mov eax,-1
mov ebx,0
p2:
t1: inc eax
jmp t3
t2: inc ebx
jmp t3
t3:
cmp eax,ebx
jnz nm1
push eax
push ebx
inc count
call print_n pascal,eax,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ebx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,2h
mov dl,32
int 21h
pop ebx
pop eax
nm1:
cmp ebx,9
jz nm2
jmp t2
nm2:
mov ebx,0
cmp eax,9
jz p3
jmp t1
;трехзначные
p3:
mov eax,0
mov ebx,0
mov ecx,0
jmp r4
r1: inc eax
jmp r4
r2: inc ebx
jmp r4
r3: inc ecx
jmp r4
r4:
cmp eax,ecx
jnz mn1
push eax
push ebx
push ecx
inc count
call print_n pascal,eax,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ebx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ecx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,2h
mov dl,32
int 21h
pop ecx
pop ebx
pop eax
mn1:
cmp ecx,9
jz mn2
jmp r3
mn2:
mov ecx,0
cmp ebx,9
jz mn3
jmp r2
mn3:
mov ebx,0
cmp eax,9
jz p4
jmp r1
p4:
;четырехзначные
mov eax,0
mov ebx,0
mov ecx,0
mov edx,0
jmp m5
m1: inc eax
jmp m5
m2: inc ebx
jmp m5
m3: inc ecx
jmp m5
m4: inc edx
jmp m5
m5:
cmp eax,edx
jnz n1
cmp ebx,ecx
jz m7
n1:
cmp edx,9
jz n2
jmp m4
n2:
mov edx,0
cmp ecx,9
jz n3
jmp m3
n3:
mov ecx,0
cmp ebx,9
jz n4
jmp m2
n4:
mov ebx,0
cmp eax,4
jz exit
jmp m1
m7:
inc count
push eax
push ebx
push ecx
push edx
call print_n pascal,eax,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ebx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ecx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,edx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,2h
mov dl,32
int 21h
pop edx
pop ecx
pop ebx
pop eax
jmp n1
exit:
call print_n pascal,word ptr count,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,4ch
int 21h
print_n proc near ;Процедура вывода десятичного числа на экран и в файл
locals @@
arg beg,zero,f_handle,pp0,num_off:word,numb:dword=arg_size
;Аргументы процедуры:
;numb: число(dword)
;num_off: смещение строки, где содержится число(word)
;pp0: 0-не печатать, 1-на экран, 2-в файл(word)
;f_handle: дескриптор файла(word)
;zero: 0-не печатать ведущие нули(word)
;beg: отступ в знаках от начала печатаемого числа(<=9)(word)
push bp
mov bp,sp
push eax
push ebx
push cx
push edx
push si
mov cx,10 ;Max длина выводимого числа
mov si,num_off
push cx
@p:
mov byte ptr [si],'0' ;Заполняем символами '0'
inc si
loop @p
pop cx
mov eax,numb ;Представляемое число
mov si,num_off ;Адрес результата для печати
add si,9
mov ebx,10 ;Делитель для выделения цифры
@@pr:
mov edx,0
div ebx
add dl,'0' ;Переводим символ в цифру
mov byte ptr [si],dl
or eax,eax ;eax=0?
jz short @@pr2
dec si
loop @@pr
@@pr2: ;В si фдрес первой ведущей ненулевой цифры
cmp pp0,0 ;Признак печати=0? Да-
je @@e6 ;Выход без печати
mov ah,40h ;Нет-печать числа
mov cx,10 ;Max длина числа
mov dx,offset num_off
mov bx,1 ;Дескриптор экрана
cmp pp0,2
je @@e1
jmp short @@e2
@@e1:
mov bx,f_handle ;Дескриптор файла
@@e2:
cmp zero,0
jne short @@e3
add cx,dx ;Помещаем в cx адрес первой ненулевой цифры
sub cx,si
mov dx,si
jmp short @@e4
@@e3:
sub cx,beg ;Ведущие нули
add dx,beg
@@e4:
int 21h
@@e6:
pop si
pop edx
pop cx
pop ebx
pop eax
mov sp,bp ;Восстанавливаем указатель стека к моменту выхода
pop bp
ret arg_size
print_n endp
count dw ?
ent db ' '
fn db 'asm.txt',0
fnd dw ?
end begin