Страница 1 из 1

Прога на Ассемблере, нужно доделать запись в файл

Добавлено: 23 дек 2006, 13:16
azze
Приветствую всех!
Даны 3 константы с фиксированной точкой в формате слова. Написать на Ассемблере программу печати двоичного представления этих констант и записать результат в файл. Первая часть задания работает, вот она:

Код: Выделить всё

.model SMALL
.STACK 100h
.DATA
const1 dw 15;pervaya konstanta
const2 dw -256;vtoraya
const3 dw 65280;tretya
prigl db 'Constants in computer memory:','$' 
ctrl db 0Dh,0Ah,'$';Enter, toyest perexod na nachalo tekushey stroki i perexod kursora na odnu poziciyu vniz
con1 db ' 6375 - ','$';Poyasneniye k pervoy konstante
con2 db ' 256 - ','$';... ko vtoroy
con3 db '65280 - ','$';... k tretyey
.CODE
start:
push @DATA
pop DS
mov ah,09h 
mov dx,offset prigl;Vivesti priqlasheniye
int 21h 
mov ah,09h
mov dx,offset con1;Vivesti poyasneniye 1 konstanti
int 21h 
mov ah,02h;Funkciya vivoda simvola
mov bx,const1;Kod 1-oy vivodimoy konstanti
mov cx,10h;Schetchik cikla = 16 , t.e. 16 bit kajdoy konstanti
mov di,3;Schetchik dlya 3-x konstant
jmp posl
met1:
mov ah,09h
mov dx,offset con2;Vivesti poyasneniye 2 konstanti
int 21h
mov ah,02h 
mov bx,const2;Kod 2-oy vivodimoy konstanti
mov cx,10h
jmp posl
met2:
mov ah,09h
mov dx,offset con3;Vivesti poyasneniye 3 konstanti
int 21h
mov ah,02h
mov bx,const3;Kod 3-yy vivodimoy konstanti
mov cx,10h
posl:
mov dx,30h;v dx zanosim kod simvola 0
shl bx,1;sdviq soderjimoqo reqistra BX na 1 bit vlevo
adc dl,0;Slojeniye s uchetom flaqa CF, t.k skladivayem s nulem, to uchitivayetsa tut tolko flaq CF
 
int 21h
loop posl;Povtorayem 16 raz
mov ah,09h
mov dx,offset ctrl;Perevod stroki
int 21h 
dec di;Umenshayem schetchik
cmp di,2;Smotrim di=2?
je met1;Da-perexod dlya vivoda 2 konstanti
cmp di,1;di=2?
je met2;Da-perexod dlya vivoda 1 konstanti
MOV AX, 4C00h;Inache vixod
int 21h
 
 
end start
Нужно немножно доделать, а именно осуществить запись в файл.
Вот попробовал так:

;----------------------------------
Тут обозначил то, что добавил
;----------------------------------

Код: Выделить всё

.model SMALL
.STACK 100h
.DATA
const1 dw 15;pervaya konstanta
const2 dw -256;vtoraya
const3 dw 65280;tretya
prigl db 'Constants in computer memory:','$' 
ctrl db 0Dh,0Ah,'$';Enter, toyest perexod na nachalo tekushey stroki i perexod kursora na odnu poziciyu vniz
con1 db ' 6375 - ','$';Poyasneniye k pervoy konstante
con2 db ' 256 - ','$';... ko vtoroy
con3 db '65280 - ','$';... k tretyey
handle dw ?
bufer db 32h dup(?)
file DB '1.txt',0
mes DB 'Oshibka', 0Ah, 0Dh,'$'
.CODE
start:
push @DATA
pop DS
;---------------sozdaniye fayla
MOV ah, 3Ch
mov CX, 2
LEA dx, file
int 21h
JC error
MOV handle, ax
;---------------
mov ah,09h 
mov dx,offset prigl;Vivesti priqlasheniye
int 21h 
mov ah,09h
mov dx,offset con1;Vivesti poyasneniye 1 konstanti
int 21h 
 
mov bx,const1;Kod 1-oy vivodimoy konstanti
mov cx,10h;Schetchik cikla = 16 , t.e. 16 bit kajdoy konstanti
mov di,3;Schetchik dlya 3-x konstant
jmp posl
met1:
mov ah,09h
mov dx,offset con2;Vivesti poyasneniye 2 konstanti
int 21h
 
mov bx,const2;Kod 2-oy vivodimoy konstanti
mov cx,10h
jmp posl
met2:
mov ah,09h
mov dx,offset con3;Vivesti poyasneniye 3 konstanti
int 21h
mov bx,const3;Kod 3-yy vivodimoy konstanti
mov cx,10h
posl:
mov dx,30h;v dx zanosim kod simvola 0
shl bx,1;sdviq soderjimoqo reqistra BX na 1 bit vlevo
adc dl,0;Slojeniye s uchetom flaqa CF, t.k skladivayem s nulem, to uchitivayetsa tut tolko flaq CF
int 21h
loop posl 
;-----------------zapis v fayl. VOT zdes nujno koe-chto ispravit
mov bx, handle
mov cx, 10h
mov ah, 40h
mov bufer[SI], dl
lea dx, bufer[SI]
int 21h
;------------------
mov ah,09h
mov dx,offset ctrl;Perevod stroki
int 21h 
dec di;Umenshayem schetchik
cmp di,2;Smotrim di=2?
je met1;Da-perexod dlya vivoda 2 konstanti
cmp di,1;di=1?
je met2;Da-perexod dlya vivoda 1 konstanti
JMP SHORT zak
int 21h
zak:
;-------------------Zakritiye fayla
MOV AH, 3Eh
MOV BX, handle
int 21h
JMP SHORT kones
;-------------------
error:
MOV AH,9
LEA DX, mes
int 21h
kones:
MOV AX, 4Ch
int 21h
end start

Файл создается, но пишет туда пару символов, а не все.
Это минутное дело для вас, уважаемые ассемблерщики. Помогите, очень нужно. Спс. всем за внимание!

Re: Прога на Ассемблере, нужно доделать запись в файл

Добавлено: 25 дек 2006, 08:55
somewhere
&quot писал(а):posl:
mov dx,30h;v dx zanosim kod simvola 0
shl bx,1;sdviq soderjimoqo reqistra BX na 1 bit vlevo
adc dl,0;Slojeniye s uchetom flaqa CF, t.k skladivayem s nulem, to uchitivayetsa tut tolko flaq CF
int 21h
loop posl
;-----------------zapis v fayl. VOT zdes nujno koe-chto ispravit
mov bx, handle
mov cx, 10h
mov ah, 40h
mov bufer[SI], dl
lea dx, bufer[SI]
int 21h
Вот тут немного поправим, буффер не заполняется - при входе в pos1 SI - должен быть 0:

Код: Выделить всё

mov dx,30h;v dx zanosim kod simvola 0
shl bx,1;sdviq soderjimoqo reqistra BX na 1 bit vlevo
adc dl,0;Slojeniye s uchetom flaqa CF, t.k skladivayem s nulem, to uchitivayetsa tut tolko 
mov [si+offset Bufer], dl
inc si
int 21h
loop posl 
;-----------------zapis v fayl. VOT zdes nujno koe-chto ispravit
mov [si+offset Bufer], 0A0Dh
lea cx, [si+2]    ;  CX := SI + 2
mov bx, handle
mov ah, 40h
lea dx, bufer
int 21h

Re: Прога на Ассемблере, нужно доделать запись в файл

Добавлено: 25 дек 2006, 16:02
azze
Спасибо, большое спасибо. Задача решена. Молодец somewhere! :)

Re: Прога на Ассемблере, нужно доделать запись в файл

Добавлено: 03 янв 2007, 19:00
M@X
Люди, такая же проблема, помогите плз. тока файл создает и все.

Код: Выделить всё

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