(Assembler) Problem z linią poleceń

0

Pisze sobie taki program:

W lini polecen wpisujemy:
C:>Program <nazwa pliku="pliku" z="z" tekstem="tekstem"> #<kod ASCII> #<kod ASCII>
I program ma zmienic w danym pliku tekstowym wszystkie znaki o kodzie ASCII pierwszym na znaki o kodzie ASCII drugim. Np.
C:\program przyklad.txt #48 #32
W pliku przyklad.txt wszystkie '0' powinny zostac zastąpione spacjami.

Nie wiem jakiej funkcji uzyc do wczytania nazwy pliku tekstowego.
Bardzo prosze o pomoc.
Pzdr

0

Zakładam, że pod DOSem to robisz. Więc proponuję przeczytać tutaj:

Proponuję zwrócić uwagę na to, co napisał Marooned:
http://4programmers.net/Forum/viewtopic.html?id=38349

Na początku DS wskazuje na blok PSP. W com, jest tak oczywiście zawsze. Odczytujesz liczbę znaków i potem czytasz wszystko, aż do spacji (lub # i odcinasz ostatnią spację) i już masz nazwę pliku.

0

Wszystko w porządku, ale nie wiem czy nazwe pliku moge wczytywac znak po znaku, czy to moze od razu caly lancuch trzeba...

0

Znak po znaku. Musisz zrobić sobie pętelkę. Chyba, że masz gdzieś pod ręką jakąś funkcję pomocniczą odczytującą jeden wyraz z łańcucha.
Robisz prostą pętelkę, kopiującą po jedym znaku do jakiegoś bufora, aż trafisz na spację.

Ponieważ chcesz przekazać nazwę pliku do funkcji otwierającej, możesz trochę zoptymalizować to. Musisz jedynie zapamiętać adres pierwszej litery ścieżki, a zamiast pierwszej spacji po nazwie pliku wstawisz 0. W ten sposób do funkcji otwierającej plik przekazać będziesz mógł adres początku (koniec wyznacza 0). A dalsze parametry już musisz odczytywać w sposób konwencjonalny.

Tutaj masz kod odczytujący z lini poleceń nazwę pliku, tworzący ten plik, a następnie zapisujący drugi parametr do niego. Troszkę przerobisz i będzie w sam raz do Twoich zastosowań.

Kod Segment
Org 100h
Assume cs:Kod,ds:Kod
start:
  mov di, 80h   ;ładuje początek lini poleceń
  mov cl, [di]
  test cl, cl
  jz koniec    ;czy jest są jakieś parametry?

  mov al, 20h
  inc di
  repe scasb ;pomija początkowe spacje

  mov dx, di ;początek pierwszego parametru
  dec dx
  test cl, cl ;jeżeli okazałoby się, że parametrem są tylko spacje
  jz koniec   ;to kończymy
  repne scasb ;przeskakuje pierwszy parametr
  mov byte ptr [di-1], 0 ;ASCIIZ, koniec pierwszego parametru-nazwy pliku

  push cx     ;przyda nam się jeszcze
  mov ah, 3ch ;tworzenie pliku, nazwa pliku pod ds:dx, które wcześniej zapamiętaliśmy
  xor cx, cx  ;brak atrybutów
  int 21h
  
  mov bx, ax  ;uchwyt pliku
  mov ah, 40h ;zapis do pliku
  pop cx      ;ile znaków do zapisania
  mov dx, di  ;początek tekstu do zapisania
  int 21h
  
  mov ah, 3eh
  int 21h

  koniec:
    mov ax, 4C00h
    int 21h
end start
ends Kod
0

Dzieki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1