[asm] Dlaczego nie działa

0

Program, który tworzy plik o podanej nazwie:

prog segment
assume CS: prog, DS: prog, ES: prog, SS: prog
org 100h

start:
      mov  AH, 0Ah
      lea  DX, bufor
      int  21h

      mov  AH, 3CH
      mov  CX, 00h
      mov  DX, offset bufor+2
      int  21h

      mov  AH, 08h
      int  21h

      mov  AX, 4C00h
      int  21h
bufor      db      254, 0, 255 dup(0)
prog ends
end start

i żaden plik się nie pojawia. Co jest nie tak??

0

Zamknij plik :) (3eh)

0

ni pomogło :(

0

a sprawdzales na "stalych" wartosciach?
moze cos ze sciezka jest nie tak, albo z nazwa ;)

0

a sprawdzales na "stalych" wartosciach?
moze cos ze sciezka jest nie tak, albo z nazwa ;)

Sprawdzałem i działa dobrze.

0

Ostani znak wprowadzany przez uzytkownika to 0dh. Jak wiadomo nie moze byc to nazwa. Wiec zamien ten znak na 0, aby byl lancuch ASCIIZ.

0

Próbowałem to zamienić w taki sposób:

      mov  AH, 0Ah
      lea  DX, bufor
      int  21h

      mov  SI, word ptr bufor[1] ;drugi bajt zawiera dlugość
      mov  bufor[SI+1], 00h ;a więc ostatni znak jest 0Dh

      mov  AH, 3CH
      mov  CX, 00h
      mov  DX, offset bufor+2
      int  21h

      mov  AH, 3Eh
      int  21h

      mov  AH, 08h
      int  21h

      mov  AX, 4C00h
      int  21h

ale nie działa. Mogę to zamienić przy pomocy pętli:

      xor  SI, SI
      ptl:
      inc  SI
      cmp  bufor[SI], 0Dh
      jne  ptl
      mov  bufor[SI], 00h

ale to jest wolniejsze. Co zrobić aby pierwszy kod działał??

0

Sprawdzone, działające

prog segment
assume CS: prog, DS: prog, ES: prog, SS: prog
org 100h

start:
  mov  AH, 0Ah
  lea  DX, bufor
  int  21h

  mov  BL, bufor[1] ;bo dlugosc to tylko jeden bajt
  xor  BH, BH 
  add  BX, 2 ; bo text jest przecież przesuniety
  mov  bufor[BX], 00h
  push BX

  mov  AH, 3CH
  xor  CX, CX
  mov  DX, offset bufor+2
  int  21h
  jc   koniec

  mov  BX, AX
  mov  AH, 3Eh
  int  21h

  pop  BX 
  mov  bufor[BX], '$'
  mov  DX, offset bufor
  mov  word ptr [bufor], 0A0Dh
  mov  AH, 09h
  int  21h
  
  xor  AH, AH ; w8
  int  16h

  koniec:
  mov  AX, 4C00h
  int  21h

  bufor  db 254,256 dup(0)

prog ends
end start

// tasm plik.asm
// tlink /t plik.obj
// td plik.com

0

Co oznacza linia

mov  word ptr [bufor], 0A0Dh

??

0

Zapisuje na koniec znaki konca lini CR, LF = 0dh, 0ah = 13, 10

// Nie na końcu, tylko na początku... Coby zacząć od nowej linii... Już nie potrzebujesz tych dwóch bajtów na początku bufora, bo BX jest wskaźnikiem do końca ciągu. [mf]

0

Na końcu?? A co określa koniec? Przecież bufor ma rozmiar 255.

0

Przy funkcji 09h koniec lancucha okresla akurat '$' :)
Zauwaz, ze CRLF zostalo wstawione na poczatku. Bufor ma bowiem taka budowe, ze pierwsze 2 bajty maja pewne znaczenie. Aby nie wyswietlac tego i jednoczesnie, aby tekst pojawil sie w nowej linijce, te 2 bajty zostaly zastapione znakami konca lini. W ten sposob tekst wyswietli sie od nowej linijki.

0

A więc zapisuje na początku bufora :-)

Dzięki wszystkim za odpowidzi :-)

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