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
mallekith [ Centurion ]
do gory prosze.
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