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...
Author: Piotr
Date: Thu, 14 May 2009 18:31
Date: Thu, 14 May 2009 18:31
50 lines
1526 bytes
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...
Author: Bogdan (bogdro)
Date: Fri, 15 May 2009 15:43
Date: Fri, 15 May 2009 15:43
65 lines
2611 bytes
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...
Author: Piotr
Date: Mon, 18 May 2009 01:20
Date: Mon, 18 May 2009 01:20
23 lines
1521 bytes
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...
Author: Bogdan (bogdro)
Date: Mon, 18 May 2009 15:28
Date: Mon, 18 May 2009 15:28
34 lines
2243 bytes
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