[(n)asm] Problem z wczytywaniem zmiennej


(Cjneq) #1

Cześć!

Piszę aktualnie programik w c++, który by tłumaczył z języka, który sobie wymyśliłem, do assemblera i assemblerował nasmem. Wszystko pod Linuksem.

Przy nauce assma kierowałem się kursem p. Bogdana (http://rudy.mif.pg.gda.pl/~bogdro/dos/boot_tut.htm). Był tam taki program:

section .text ; początek sekcji kodu

	global _start	; _start będzie symbolem globalnym,

			; od którego zacznie się wykonywanie programu


	_start:


		mov	eax, 3 ; czytanie z pliku

		mov	ebx, 0 ; z klawiatury

		mov	ecx, imie	; dokąd czytać?

		mov	edx, imie_dl	; ile bajtów czytać?

		int	80h ; wczytujemy



		mov	eax, 1

		xor	ebx, ebx

		int	80h

section .data		


	imie: times 20 db 0

	imie_dl equ	$ - imie

Na podstawie tego stworzyłem takie coś:

jmp zkl1

cinek: times 20 db 0

cinekdl equ $ - cinek

zkl1: 

 mov eax, 3

 mov ebx, 0

 mov ecx, cinek

 mov edx, cinekdl

 int 80h

 mov eax, 1

 int 80h

Problem jest tu taki: wczytuje tylko jeden znak (do tabeli cinek) zamiast tych 20 znaków.

Z góry dzięki,

Cjneq


(Ryan) #2

Są dwie konwencje przekazywania parametrów. Wykorzystujesz rejestry (w kolejności EBX, ECX, EDX, ESI, EDI, EBP). Skoro to nie działa - spróbuj ze stosem. Prototyp funkcji:

read(int fd, void *buf, size_t nbyte);

Parametry zrzucasz na stos od prawej, czyli cinekdl, cinek, 0. Sprawdzałeś przykładowy, niezmodyfikowany program? Działa?


(Cjneq) #3

Tamten problem rozwiązałem... za to mam inny:

jmp zkl3

 section .data

cinek2 dd 0

cinek2dl equ $ - cinek2

 section .code

zkl3: 

	mov eax, 10 

	mov [cinek2], eax 

		mov eax, cinek

		cmp	eax, cinek2

		je	rownb0

		cmp	eax, cinek2

		jne	nierow0

		rownb0:

 jmp zkl5

zmienna1 db "Podałeś: ", 0ah

zmienna1dl equ $ - zmienna1

zkl5: 

 	mov eax, 4

 	mov ebx, 1

 	mov ecx, zmienna1

 	mov edx, zmienna1dl

 	int 80h

		 mov eax, 4

		 mov ebx, 1

		 mov ecx, cinek

		 mov edx, cinekdl 

		 int 80h

jmp	dalej0

nierow0:

 jmp zkl6

zmienna2 db "Haha ", 0ah

zmienna2dl equ $ - zmienna2

zkl6: 

 	mov eax, 4

 	mov ebx, 1

 	mov ecx, zmienna2

 	mov edx, zmienna2dl

 	int 80h

dalej0:

 jmp zkl7

Kiedy cinek == cinek2, to wykonuje się to samo, co cinek != cinek2. Co tu nie pasuje?


(Ryan) #4
  1. Wklejaj proszę cały kod - zgadywanie czym jest cinek nie jest przyjemne.

  2. Zdaje się, że porównujesz adresy a nie zawartość:

    mov [cinek2], eax

    mov eax, cinek

    cmp eax, cinek2

zawartość: [cinek2]

adres: cinek2


(Cjneq) #5

lang_out.asm:39: error: invalid combination of opcode and operands

(39 to jest ta linia mov cinek2, eax).

A cały plik to:

section .text

global _start

_start:

 jmp info_after

		compiler_name dw "PLC - Palla Compiler 0.0.1"

		compiler_name_dl	equ	$ - compiler_name

	  	compiler_version dw "0.0.0.24"

		compiler_version_dl	equ	$ - compiler_version

	 	compiler_author dw "Marcin Stojanowski"

		compiler_author_dl	equ	$ - compiler_author

 info_after:

jmp zkl0

 section .data

cinek dd 0

cinekdl equ $ - cinek

 section .code

zkl0: 

 jmp zkl2

zmienna0 db "Podaj liczbę ", 0ah

zmienna0dl equ $ - zmienna0

zkl2: 

 	mov eax, 4

 	mov ebx, 1

 	mov ecx, zmienna0

 	mov edx, zmienna0dl

 	int 80h

		 mov eax, 3

		 mov ebx, 0

		 mov ecx, cinek

		 mov edx, cinekdl

		 int 80h

jmp zkl3

 section .data

cinek2 dd 0

cinek2dl equ $ - cinek2

 section .code

zkl3: 

	mov eax, 10 

	mov cinek2, eax 

		mov eax, cinek

		cmp	eax, cinek2

		je	rownb0

		cmp	eax, cinek2

		jne	nierow0

		rownb0:

 jmp zkl5

zmienna1 db "Podałeś: ", 0ah

zmienna1dl equ $ - zmienna1

zkl5: 

 	mov eax, 4

 	mov ebx, 1

 	mov ecx, zmienna1

 	mov edx, zmienna1dl

 	int 80h

		 mov eax, 4

		 mov ebx, 1

		 mov ecx, cinek

		 mov edx, cinekdl 

		 int 80h

jmp	dalej0

nierow0:

 jmp zkl6

zmienna2 db "Haha ", 0ah

zmienna2dl equ $ - zmienna2

zkl6: 

 	mov eax, 4

 	mov ebx, 1

 	mov ecx, zmienna2

 	mov edx, zmienna2dl

 	int 80h

dalej0:

 jmp zkl7

zmienna3 db "", 0ah

zmienna3dl equ $ - zmienna3

zkl7: 

 	mov eax, 4

 	mov ebx, 1

 	mov ecx, zmienna3

 	mov edx, zmienna3dl

 	int 80h

end:

 	mov eax, 1

	xor ebx, ebx

	int 80h

Przepraszam, jeżeli kod będzie nieczytelny (układ), ale jest generowany automatycznie.


(Ryan) #6

Wybaczam. :wink: Czy nie sądzisz, że wpisanie wartości pod adresem (mov [cinek2], ax) ma większy sens niż próba przypisania wartości do stałej (mov cinek2, ax)?

W dalszym zabijaniu błędów tego typu może Ci pomóc dział 3.2 tego tutka

http://webster.cs.ucr.edu/Articles/X86FAQ/tasm.html

Złączono Posta : 24.06.2007 (Nie) 18:34

Jeszcze jest taki problem - cinek2 deklarujesz jako dd a wpisujesz w. Staraj się kontrolować typy.


(Cjneq) #7

Może nie poinformowałem, ale używam nasma, nie tasma, ale zerknę ::).


(Ryan) #8

Poinformowałeś. Żaden kompilator nie zgadnie czy masz na myśli adres czy wartość pod adresem. Warto zatem zrozumieć adresowanie pamięci.


(Cjneq) #9

Chodzi o "mov [cinek2], eax "?

Może wysłałem nieaktualną wersję. Poza tym wszystko jest jak było [w kodzie].

z mov [cinek2], eax też nie działa...