Asembler czytanie z bufora

0

czesc,

mam nastepujacy problem, mam w buforze jakis ciag znakow oddzielony spacja, chce 1 czesc do spacji wpisac do jednej zmiennej i dodac znak na koncu, a 2 czesc po spacji wpisac do 2 zmiennej i dodac znak na koncu.

Przykładowy fragment kodu:

Kopiuj
bufor db 100 dup('$')
zmienna1 db 50 dup('$')
zmienna2 db 50 dup('$') 

; tutaj wykonuje operacje pobrania do bufora ciagu znakow
; przykladowo mam w bufor == "Ala Ola"
; chce wpisac do zmienna1 AlaX, a do zmienna2 OlaX
 

Robilem to tak, ze przechodzilem po kolei po kazdym znaku bufora az do jego zakonczenia wpisujac kolejne znaki do odpowiednich zmiennych.
Wszystko dzialal, mam w zmiennych to co chce poza dodawaniem znaku X na koncu, do 1 zmiennej dodaje tak jak chce na koniec, a do zmiennej 2 ZAWSZE dodaje mi ten znak zamiast na ostatniej pozycji to na 1. Czyli zamiast OlaX mam za kazdym razem Xla, zamazuje dodatkowo 1 znak.

Probowalem juz wielu rzeczy, wlacznie z osobna procedura ktora przechodzi na sam koniec zmiennej2 zeby dopisac tam znak X ale za kazdym razem X laduje na 1 znaku, nadpisujac go.

Nie mam pojecia dlaczego tak sie dzieje, bylbym wdzieczny za pomoc

Andy Misio
Kryształowa kula jeszcze nie doszła mi z chin. Pokaż kod ; )
0

Tutaj kod:

Kopiuj
init:	
	mov	ax, seg bufor
	mov	es,ax
	mov	si,offset bufor                  ; pod si adres 1 znaku argumentow 
	mov	di,offset zmienna1
	xor	cx,cx	
	mov	cl,byte ptr es:[liczba_znakow]   ; cx = ilosc znakow
p1:	
	push cx
	mov	al,byte ptr es:[si]
	cmp al, 32                  ; czy spacja? 
	jnz dalej
		mov byte ptr es:[di], 'X'     ; dodaje X na koniec 1 zmiennej 
                mov	di,offset zmienna2	; jesli tak to zapisujemy 2 czesc do 2 bufora 
              	jmp kont
				
	dalej:
	mov	byte ptr es:[di],al 	
	inc	di
	kont: 
	inc	si   	
	pop	cx
	loop	p1                            ; petla do skonczenia znakow z bufora 
        mov byte ptr es:[di], 'X'     ; dodanie X na koniec zmiennej2, to wlasnie tutaj nie dziala i dodaje na 1 pozycje 
	
	
ret  
Andy Misio
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:22
0

Nie mam windowsa przy sobie, machnołem Ci coś takiego ale na linuxie:

Kopiuj

segment .data
	napis db "Ala Ola ", 0Ah, 0h 

segment .bss
	buf1 resb 20
	buf2 resb 20

segment .text
        global  _start

_start:
	push napis	;napis na stos
	call strlen	;sprawdz dlugosc stringu znak do \0

	push eax	;dlugosc na stos
	push napis	;napis na stos
	call wypisz	;wyswietl

	push napis	;napis na stos
	push buf1	;tablica na stos
	call zamiana_x_spacja	
	push eax	;zachowujemy sobie gdzie skonczylismy zeby nie ucieklo
	
	push buf1	;wyswietlamy co przerobilismy
	call strlen	;dlugosc
	
	push eax	;glugosc na stos
	push buf1	;tablica na stos
	call wypisz	;wyswietlamy tablicę

	
	;gdzie skonczylismy jest na stosie
	push buf2	;drugi buf na stos
	call zamiana_x_spacja

	push buf2	;dlugosc 2 buf'a
	call strlen

	push eax	
	push buf2
	call wypisz	;wyswietlamy 2 buf'a

	call zakoncz	;konczymy

zamiana_x_spacja:
	push ebp
	mov ebp,esp
	push esi
	push edi
	push ecx
	push ebx

	mov esi, dword [ebp+08h]	; buf
	mov edi, dword [ebp+0Ch]	;napis
	petla:
		mov cl, [edi]		;najpierw kopjujemy
		mov [esi],cl		;
		inc esi			;inkrementacja
		inc edi
		cmp cl,' '		;sprawdzamy ze spacja
		jnz petla		;jesli nie jedziemy dalej
		mov [esi-1],byte 'X'	;za daleko? wpiszmy o jeden bajt wczensiej (poniewaz inkrementowalismy)
		mov [esi], byte 0	; znak 0 zeby nam strlen dzialal

	mov eax,edi ;zwracamy przez eax adres gdzie skonczylismy
	pop ebx
	pop ecx
	pop edi
	pop esi
	pop ebp
	ret 8


strlen:
	push ebp
	mov ebp,esp
	push ebx
	push ecx
	
	mov ebx, dword [EBP+08h]
	xor eax,eax
	sprawdz:
		mov cl,[ebx]
		inc eax
		inc ebx	
		cmp cl,0
		jne sprawdz
	
	pop ecx
	pop ebx
	pop ebp
	ret 4
wypisz: 
	push ebp
	mov ebp, esp
	push eax
	push ebx

        mov eax, 4
        mov ebx, 1
	mov ecx, dword [ebp+08h]
	mov edx, dword [ebp+0Ch]
	int 80h

	pop eax
	pop ebx
	pop ebp
	ret 8

zakoncz:
        mov     eax, 1
        xor     ebx, ebx
        int     0x80

 

Interesujace jest dla Ciebie "funkcja" zamiana_x_spacja. Pamietaj ze w twoim przypadku potrzebujesz zakonczyc string do wywietlenia znakiem $. Jak coś dodatkowo pytaj ;)


Brak
0

Dzięki wielkie!

Mam jeszcze pytanie z innej beczki, mianowicie przy czytaniu z pliku. Chce przeczytac caly plik, od poczatku do samego konca, zrobilem to w petli z loopem gdzie do cxa laduje dlugosc pliku, ale jestem przez to ogarniczony jedynie do 2^16 bajtowych plikow. Jak czytac sewencyjnie caly plik az do konca, nie znajac jego rozmiaru?
Wiem, ze po poprawnym wczytaniu przerawniem 3Fh dosowym do cf laduje 0, w przypadku bledu jest to 1. Czy mozna zrobic petle, ktora konczy cf == 1, wtedy przeczytam caly plik? Ewentualnie jakas inna metoda na to.

Dziekuje raz jeszcze o pomoc!

0

@Edit

Sprawdzilem petle z tym CF, wpada w nieskonczona petla, ktora czyta caly plik do ostatniego znaku a potem czyta ten ostatni znak w nieskonczonosc, czyli to nie zadziala. Sa jakies inne sposoby?

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 20 godzin
0

zrobilem to w petli z loopem gdzie do cxa laduje dlugosc pliku, ale jestem przez to ogarniczony jedynie do 2^16 bajtowych plikow

Użyj ECX.

Tylko nie wiem jak pod twoim asemblerem (TASM?) zapisać LOOP by używał ECX zamiast CX.
Spróbuj loop dword, loop dword ptr, loopd, w ostateczności zamień na dec/cmp/jnz.

czyli to nie zadziala
Zadziała, tylko coś źle robisz.

edytowany 1x, ostatnio: Azarien
Andy Misio
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:22
0

Tzn, aby sprawdzić czy doszliśmy do końca pliku, należy porównać liczbę bajtów, którą chciałeś odczytać od tej ile w rezultacie odczytałeś.

Kopiuj
mov ah,3fh
mov dx, offset bufor ;bufor
mov bx,uchwyt		;uchwyt pliku
mov cx,wielkosc	;ilość bajtów do odczytania
int 21h
jc blad			;CF=1, błąd
cmp ax,cx		;nie ma błędu sprawdzamy ile odczytalismy
jb Odczyt_zakonczony	;różnica, czyli koniec pliku
 

Nie wiem jak jest w przypadku, plików wiekszych niż te 64K, nie mam jak sprawdzić. Ale możliwe, że uchwyt pliku tworzy się poprzez jakiś es:bx, co było by wielce korzystne. Niestety nie mogę znaleźć takiej informacji.


Brak
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)