🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
4 messages
4 total messages Started by Piotr Thu, 14 May 2009 18:31
Prosty programik, ale nie dziala...
#1905
Author: Piotr
Date: Thu, 14 May 2009 18:31
50 lines
1526 bytes
Witam! Mam tablice danych .byte. Chce wyswietlic jakis element (np. 
pierwszy), tzn. odpowiednik liczby w tablicy ASCII. Dlaczego to nie 
dziala? (GNU As)

############################################

SYSEXIT = 1
SYSREAD = 3
SYSWRITE = 4
STDOUT = 1
STDIN = 0
EXIT_SUCCESS = 0

.section .data

data1:
	.byte 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30


.section .text

.globl _start

_start:

mov $0, %edi


mov $SYSWRITE, %eax
mov $STDOUT, %ebx
mov data1(,%edi,1), %ecx    # - chyba ta linijka jest zla...
mov $1, %edx
int $0x80


movl $1, %eax
movl $0, %ebx
int $0x80


###############################

Po prostu nic mi nie wypisuje :(


Prosze o pomoc....


Pozdrawiam
Piotr
Re: Prosty programik, ale nie dziala...
#1906
Author: Bogdan (bogdro)
Date: Fri, 15 May 2009 15:43
65 lines
2611 bytes
Piotr pisze:
> Witam! Mam tablice danych .byte. Chce wyswietlic jakis element (np.
> pierwszy), tzn. odpowiednik liczby w tablicy ASCII. Dlaczego to nie
> dziala? (GNU As)
> 
> ############################################
> 
> SYSEXIT = 1
> SYSREAD = 3
> SYSWRITE = 4
> STDOUT = 1
> STDIN = 0
> EXIT_SUCCESS = 0
> 
> .section .data
> 
> data1:
>     .byte 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30
> 
> 
> .section .text
> 
> .globl _start
> 
> _start:
> 
> mov $0, %edi
> 
> 
> mov $SYSWRITE, %eax
> mov $STDOUT, %ebx

> mov data1(,%edi,1), %ecx    # - chyba ta linijka jest zla...

 Tak, raczej tak. Tutaj do %ecx ładujesz zawartość komórki o numerze
%edi z tablicy "data1". W składni intela, jeśli znasz, wyglądałoby to tak:
	mov	ecx, [data1+edi]
 a tymczasem w ECX ma być wskaźnik do bufora z danymi (innymi słowy -
adres bufora z danymi). Można to osiagnąć na co najmniej dwa sposoby:

1. Użyć LEA zamiast MOV:

	lea data1(,%edi,1), %ecx

  Ta instrukcja załaduje do %ecx adres pierwszego argumentu
instrukcji, czyli adres zmiennej o adresie "data1(,%edi,1)".

2. Wpisać adres bezpośrednio do %ecx. Nie jestem biegły w AT&T, ale
myślę, że powinno to wyglądać tak:

	mov $data1(,%edi,1), %ecx

  (tzn. ze znakiem dolara przed zmienną).

[...]
> Po prostu nic mi nie wypisuje :(

 Ale, patrząc z pozytywnej strony, program nie jest mordowany przez
system :) (a tak się mogło zdarzyć).

-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Re: Prosty programik, ale nie dziala...
#1907
Author: Piotr
Date: Mon, 18 May 2009 01:20
23 lines
1521 bytes
Slicznie Ci dziekuje... Napisalem pierwsza instrukcje i dziala... Prosze 
jeszcze o pomoc... wydawalo to mi sie banalne... ale niestety znowu mi 
tradycyjnie nie dziala :(

Program teraz wyswietla mi odpowiedniki w ASCII elementu tablicy data1 
... Jaka instrukcja "zamienie" to na cyfry???

Probuje dodac 0x30 (addl $0x30, %ecx) ... Ale to jest zle...

Liczbe data1, mam tak napisana:

data1:
	.byte 0x00, 0x00, 0x00 itd...

czyli po dodaniu 0x30 powinien dostac znak '0' i to ladnie powinno mi 
wypisac... Niestety tego nie robi...


Prosze o pomoc...


Pozdrawiam serdecznie
Piotr
Re: Prosty programik, ale nie dziala...
#1908
Author: Bogdan (bogdro)
Date: Mon, 18 May 2009 15:28
34 lines
2243 bytes
Piotr pisze:
> Slicznie Ci dziekuje... Napisalem pierwsza instrukcje i dziala... Prosze
> jeszcze o pomoc... wydawalo to mi sie banalne... ale niestety znowu mi
> tradycyjnie nie dziala :(
> 
> Program teraz wyswietla mi odpowiedniki w ASCII elementu tablicy data1
> ... Jaka instrukcja "zamienie" to na cyfry???
> 
> Probuje dodac 0x30 (addl $0x30, %ecx) ... Ale to jest zle...
> 
> Liczbe data1, mam tak napisana:
> 
> data1:
>     .byte 0x00, 0x00, 0x00 itd...
> 
> czyli po dodaniu 0x30 powinien dostac znak '0' i to ladnie powinno mi
> wypisac... Niestety tego nie robi...

 No pewnie, bo w %ecx, jak już ustaliliśmy, jest *adres* pierwszego
bajtu zmiennej do wypisania, a nie pierwszy bajt do wypisania. Dodając
do niego 0x30, po prostu przesuwasz ten adres w %ecx na zmienną
znajdującą się 0x30 bajtów dalej i to ją wypisujesz. Innymi słowy: nie
zmieniasz zawartości zmiennej "data1" przed jej wyświetleniem. Spróbuj

	lea data1(,%edi,1), %ecx
	addl $0x30, (%ecx)

(chodzi o tę drugą linijkę).

-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads