GRY-Online.pl --> Archiwum Forum

assembler - potrzebna pomoc.

12.06.2006
13:09
[1]

mallekith [ Centurion ]

assembler - potrzebna pomoc.

mam 2 programy i chce je polaczyc w ten sposob, zeby program kopiowal znaki z jednego pliku do drugiego,ale znaki zamienione kolejnoscia, np: plika: abcd, to do pliku plikb zapisze sie dcba. ponizej umieszczam 2 programy, jeden kopiuje znaki z pliku do pliku,drugi przepisuje tablice w odwrotnej kolejnosci. jezeli ktos z was potrafi to zrobic to bylbym bardzo wdzieczny.


;pierwszy program

;***************************************************
;program kopiuje znaki z pliku zrodla do pliku cel
;***************************************************

.model small

.stack 512

.data
file1 db "in.txt", 0
file2 db "out.txt", 0

.data?
buffer db 1024 dup (?)

.code
start:
mov ax, seg file1
mov ds, ax
; open input file
mov dx, offset file1 ; DS:DX - nazwa pliku
mov ah, 3Dh ; otworz plik
mov al, 0
int 21h
jc open_error
mov si, ax
; plik wyjsciowy
mov dx, offset file2
mov cx, 0
mov ah, 3Ch ;utworz plik
int 21h
jc create_error
mov di, ax
mov ax, seg buffer
mov ds, ax

copy_loop:
mov dx, offset buffer
; read block
mov bx, si
mov cx, sizeof buffer
mov ah, 3Fh
int 21h
jc loop_error
cmp ax, 0
jz loop_error
; write block
mov bx, di
mov cx, ax
mov ah, 40h
int 21h
jz loop_error
; write '*'
mov ah, 02h
mov dl, '*'
int 21h

jmp copy_loop

loop_error:
mov ah, 3Eh ; zamknij cel
mov bx, di
int 21h

create_error:
mov ah, 3Eh ; zamknij zrodlo
mov bx, si
int 21h
open_error:
mov ax, 4C00h ; koniec
int 21h
end start





;drugi program

program kodujacy wczytany tekst: dodanie do kodu ascii znaku liczby
; rownej dlugosci wczytanego tekstu w razie przekroczenia wartosci 7ah
; nadmiar dodac do 20h, by znak sie miescil w zakresie (20h,7ah)



dane SEGMENT
nl db 0ah,0dh,'$'
tekst db 20 dup (?)
dane ENDS

rozkazy SEGMENT
ASSUME cs:rozkazy, ds:dane


;---------------------------------------------
; wczytywanie

wczytaj PROC
xor si,si
LEA bx,tekst

@1:
mov ah,1 ;wczytanie znaku do al
int 21h

cmp al,0dh ;czy wcisnieto ENTER
je kon
mov byte PTR [bx+si],al ;zapisz wczytany znak
inc si
jmp @1

kon:
mov byte PTR [bx+si],'$' ;funkcja 9 przerwania 21 wypisuje zawartosc dx
;do znaku '$'
RET
wczytaj ENDP


;---------------------------------------------
; wypisywanie

wypisz PROC
push bx
push ax

LEA dx,tekst
mov ah,9
int 21h

pop ax
pop dx
RET
wypisz ENDP


;---------------------------------------------
; przechodzenie do nowej linii
new_line PROC
push dx
push ax

LEA dx,nl
mov ah,9 ;wypisanie zawartosci dx
int 21h

pop ax
pop dx
ret
new_line ENDP


;---------------------------------------------
koduj PROC

xor ax,ax
mov cx, si ;licznik petli rowny dlugosc tekstu
mov ax,si ;o ile zwiekszyc kod ascii

xor si,si
LEA bx,tekst

porownaj: ;sprawdz czy zakodowany znak sie miesci w zakresie
cmp ah,7ah ;po odjeciu 20h nadal kod znaku moze byc zbyt duzy
jna petla

sub ah,5ah
jmp porownaj

petla:
add byte PTR [bx+si],al ;dodanie do znaku ascii przesuniecia (kodowanie)
cmp byte PTR [bx+si],7ah ;sprawdzenie czy zakodowany znak miesci sie w
;odpowiednim zakresie
jna kon2

sub byte PTR [bx+si],5ah ;w razie przekroczenia zakresu odejmij 20h to
;otrzyma sie znak z zakresu
kon2:
inc si
loop petla
RET
koduj ENDP



;---------------------------------------------
Linia_polecen PROC
mov ah, 62h ;pobranie adresu segmentu PSP do rejestru BX
int 21h
mov es, bx ;zapamiętujemy segment PSP w rejestrze ES
mov bx,82h ;na 82 bajcie zaczyna sie pierwsza liczba z parametru
;wpisywanego do linii poleceń
RET
Linia_polecen ENDP



;---------------------------------------------
; program glowny
start:

mov ax, SEG dane
mov ds,ax
call wczytaj
call koduj
call new_line
call wypisz

mov ah,4ch
int 21h

rozkazy ENDS

mystos SEGMENT STACK
dw 128 dup (?)
mystos ENDS

END start

12.06.2006
13:55
[2]

mallekith [ Centurion ]

do gory prosze.

12.06.2006
14:18
[3]

Mindlord [ Generaďż˝ ]

powiem tak...
nie pisalem nigdy w assemblerze ale z tego co widze to masz zadeklarowane pliki in i out
wydaje mi sie ze przede wszystkim powinienes odpalajac program wprowadzac nazwe pliku in jako parametr - wtedy mozesz podac np nazwa_programu.exe pliczek.txt

teraz tak:
jezeli podasz nazwe pliku in jako parametr to na parametrze bedziesz mogl robic jakiekolwiek operacje w zwiazku z tym w tym momencie ten parametr musisz wykorzystac jako dane wejsciowe do tego programu odwracajacego tabele, a dane wyjsciowe zadeklarowac jakos plik out...

tak to widze

np. w perlu czy w c banalna sprawa, ale kurna w assemblerze - dla mnie lipa

© 2000-2024 GRY-OnLine S.A.