» »

[nasm] scanf

[nasm] scanf

arjan_t ::

ima kdo idejo zakaj vedno dobim segmentation fault?

bits 32
extern scanf
global main

section .data:
		format db "%d",10,0
		stevilo dd 0

section .text:
main:
		push dword stevilo
		push dword format
		call scanf
		add esp,8
		
		ret

smoke ::

EDIT: Oba parametra moras podati kot pointerja ne kot vrednost. Tak je prav:

push stevilo
push format
call strcmp
add esp, 8

Zgodovina sprememb…

  • spremenil: smoke ()

arjan_t ::

ne, ne dela :(

smoke ::

Ce pa se tak ne bo slo potem je pa nekaj narobe z samim klicem do scanf funkcije. Bom snel nasm pa pogledal kak dejansko naredi import tabelo.

arjan_t ::


push stevilo
push format
call strcmp
add esp, 8


hm, s scanf mi to ne dela

smoke ::

Hm, a skompajla pa okej? Ce ja, bi blo mozno uploadat ta program nekam? Da pogledam kak program dejansko poklice scanf funkcijo. Zgleda da je problem tam.

Brane2 ::

Question:

Kako funkcija ve, koliko parametrov jo čaka na stacku, če base pointer ne kaže na začetek parametrov ?

Tu mislim na funkcije s spremenljivim številom parametrov...
On the journey of life, I chose the psycho path.

smoke ::

Daj mi en tocen primer funkcije s spremenljivim stevilom parametrov pa ti povem. ;)

Brane2 ::

printf ?
On the journey of life, I chose the psycho path.

arjan_t ::

Hm, a skompajla pa okej? Ce ja, bi blo mozno uploadat ta program nekam? Da pogledam kak program dejansko poklice scanf funkcijo. Zgleda da je problem tam.


program je točno takšen kot v prvem postu

smoke ::

Simple, ko ti funkcijo poklices, stvar ko parsa besedilo, lepo vstavlja noter to kar si dal za parametre. Funkcija dejansko ne ve kolk je parametrov, ampak nekak sklepa da jih ne bo vec kot pa jih ti zelis recimo izpisati. Se pravi ce nardis tole:

printf("%d, %d", stevilo1, stevilo2);

Bo program sklepal, da zato ker zelis 2 stevili izpisat sta 2 parametra. ampak kaj se pa zgodi ce nardis tole:

printf("%d %d", stevilo1);

Prvo bo izpisana bo vrednost ki je v spremenljivki stevilo1, naslednja vrednost ki bo pa izpisana pa bo ta ki je pac naslednja na stacku. ;)

LP

arjan_t, uploadaj exe nekam, pa bomo ugotovili kaj je narobe.

Zgodovina sprememb…

  • spremenil: smoke ()

arjan_t ::

težko dam exe gor, delam na linux-u

smoke ::

erm, sej na linuxu so tut exeji, samo koncnice so drugacne (ali pa jih ni). uploadaj executable datoteko nekam.

Brane2 ::

Prvo bo izpisana bo vrednost ki je v spremenljivki stevilo1, naslednja vrednost ki bo pa izpisana pa bo ta ki je pac naslednja na stacku. ;)


Eh, crap. In potem se folk sprašuje, zakaj toliko bugov v kodi >:D

Je pa hecno, da gcc po defaultu uporablja basepointer, ga pa spusti pri -O2 ali pa -fomit-frame-pointer.

Kar pomeni,d a ga eksterne funkcije iz glibca niti ne rabijo...
On the journey of life, I chose the psycho path.

DustWolf ::

arjan_t: Ne pozabi na koncu programa klicat exit syscalla, sicer bo program na koncu vedno crashal.

mov ebx,0 ; exit code, 0=normal
mov eax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel
http://www.juresah.si/

Brane2 ::

BTW: je kje kak editor na linuxu, ki pozna sintakso asm in ima "code completion" in podobne bombončke ?

Intlova sintaksa me ubija. Vem da ukaz obstaja, ne vem pa imena. Potem pa ga iščem po buklah pol ure.

Ali pa vsaj kak on-line index ukazov x86_64 ?
On the journey of life, I chose the psycho path.

DustWolf ::

Brane2: Za programiranje v linuxu so text editorji čisto ql. Jaz vedno uporabljam vim, kolega pa recimo gedit... asm sintaks je več, če ti ne prepozna tvoje prav pač napišeš svoj syntax file (mam fasm.vim, če kdo rabi).

Zakaj bi bil code completion v asm lahko koristen si ne predstavljam, glede na to da so vsi ukazi like 3, 4 ali izjemoma 5 črk, kaj pa zraven pride je pa čisto odvisno od tega kaj hočeš narest. Če rabiš nek ukaz pol ure iskat po bukli, vrži buklo stran in odpri raje PDF priročnik od assemblerja pa naredi search.

EDIT: Polek vima prav pride še makefile, da lahko hitro compilaš kodo in jo spraviš v pogon brez ekscesivnega tipkanja.
http://www.juresah.si/

Zgodovina sprememb…

  • spremenil: DustWolf ()

arjan_t ::

erm, sej na linuxu so tut exeji, samo koncnice so drugacne (ali pa jih ni). uploadaj executable datoteko nekam.


ja vem =), ker si napisal exe sem sklepal da za windows

@DustWolf: niti ne pride do konca programa, tudi če je kaj za klicem scanf se ne izvede

DustWolf ::

arjan_t: Exe (oziroma generičen binary) rabimo nekako zato da pogledava kaka koda v praksi rata in poženeva skozi debugger. Mi2 z smokom to zato ker ne veva kaj točno spacka NASM na podlagi tiste kode, ampak tudi sicer ti toplo priporočam ta pristop. V tem je nekako čar ASM, da z debuggerjem steppaš skozi svojo kodo in pogledaš kje se zalomi. :)
http://www.juresah.si/

arjan_t ::

aaaaaaaa sem debil =)

napaka -> : za section .ime, kr avtomatsko sem očitno napisal zraven

se opravičujem za potrato časa tistih ki ste pomagali =)

Brane2 ::

Brane2: Za programiranje v linuxu so text editorji čisto ql. Jaz vedno uporabljam vim, kolega pa recimo gedit... asm sintaks je več, če ti ne prepozna tvoje prav pač napišeš svoj syntax file (mam fasm.vim, če kdo rabi).


Pri Code::Blocks mi je všeč to,d a lahko recimo odprem linux kernel sources ( ~ 20k files ), postavim kurzor na klic neke funkcije v kodi in zahtevam da mi najde njeno definicijo ali deklaracijo.

Ali pa, da mi stvar sama name completion med tipkanjem - v smislu da recimo deklariram "int32 my_nov_var1 = 17", nato pa nekje pozneje v kodi začnem nekaj v stilu "var2 = my_no..." in mi stvar med tipkanjem ponudi vse vare s tem začetkom in zožuje izbor, ko dodajam nove karakterje.


Zakaj bi bil code completion v asm lahko koristen si ne predstavljam, glede na to da so vsi ukazi like 3, 4 ali izjemoma 5 črk, kaj pa zraven pride je pa čisto odvisno od tega kaj hočeš narest.


PACKSSDW
MOVMSKPD
PMOVMASKB
MASKMOVDQU
PMADDWD
LDMXCSR
PUNPCKHBW
UNPCKLPD
...


Če rabiš nek ukaz pol ure iskat po bukli, vrži buklo stran in odpri raje PDF priročnik od assemblerja pa naredi search.


AMD ima 5 pdfov. Ni ravno udobno iskat po vseh. Da se, ni pa ravno lepo.
On the journey of life, I chose the psycho path.

Zgodovina sprememb…

  • spremenil: Brane2 ()

DustWolf ::

Pri Code::Blocks mi je všeč to,d a lahko recimo odprem linux kernel sources ( ~ 20k files ), postavim kurzor na klic neke funkcije v kodi in zahtevam da mi najde njeno definicijo ali deklaracijo.

Ali pa, da mi stvar sama name completion med tipkanjem - v smislu da recimo deklariram "int32 my_nov_var1 = 17", nato pa nekje pozneje v kodi začnem nekaj v stilu "var2 = my_no..." in mi stvar med tipkanjem ponudi vse vare s tem začetkom in zožuje izbor, ko dodajam nove karakterje.


Ker je tak težko natipkat celo ime konstante? Če se ne motim je poanta equjev ravno v tem da so berljivi, sicer ti pa nič ne preprečuje da ne bi napisal, recimo 17.


PACKSSDW
MOVMSKPD
PMOVMASKB
MASKMOVDQU
PMADDWD
LDMXCSR
PUNPCKHBW
UNPCKLPD


In vse to so kratice. Če bi mel nek completion ne bi nič pridobil ali pa bi ti zadeva celo težila za vse komplicirane ukaze vsakič ko bi MOV napisal.

AMD ima 5 pdfov. Ni ravno udobno iskat po vseh. Da se, ni pa ravno lepo.


Odpreš 5 desktopov, na vsakem imaš po en PDF in potem lepo switchaš. Sicer pa mora opkode implementirat tudi assembler ki ga uporabljaš zato je logično sklepat da bi ta moral met nek priročen seznam nekje.
http://www.juresah.si/

Brane2 ::

Ker je tak težko natipkat celo ime konstante?


Ne, ker se je tako lahko zatipkat. SPloh če imajo sorodne zadeve smiselna imena. Takrat lahko fališ ime, ne da bi to takoj videl, ker se bo pač asmju stvar izšla. Če pa imaš completion, takoj vidiš, da je na izbiro N kandidatov.



Če se ne motim je poanta equjev ravno v tem da so berljivi, sicer ti pa nič ne preprečuje da ne bi napisal, recimo 17.


Uporaba števil namesto imen je zelo nepraktična.


In vse to so kratice. Če bi mel nek completion ne bi nič pridobil ali pa bi ti zadeva celo težila za vse komplicirane ukaze vsakič ko bi MOV napisal.


Seveda bi. Če bi recimo iskal nek zajebani mov iz MMX v XMM register, bi vedel kje iskati.
Vtipkal bi MOV in pogledal, kaj se je znašlo na seznamu, nato pa ga počasi ožil.
Nek pošten editor bi mi lahko poiskal tudi definicijo ukaza...


Odpreš 5 desktopov, na vsakem imaš po en PDF in potem lepo switchaš. Sicer pa mora opkode implementirat tudi assembler ki ga uporabljaš zato je logično sklepat da bi ta moral met nek priročen seznam nekje.


To imam že sedaj. Ampak iskanje po 5 500+ stranskih PDFih ni ravno trenutno.
Code::Blocks to ima implementirano SUPER. Na žalost samo za podprte jezike, ASMja pa ni med njimi.
On the journey of life, I chose the psycho path.

Gundolf ::

Sem v mojem Code::Blocks na hitro čekiral in opazil da ima sintaxo za MASM assembler. A code completition pa kljub temu ne dela al kako?

Brane2 ::

Meni ne, če vključujem asm v c source z __asm__ __volatile_( ...
On the journey of life, I chose the psycho path.

Gundolf ::

Aja, razumem, inline ne dela, mora biti .asm fajl da preklopi na pravo sintakso. No ja, lahko uporabljaš en scratch .asm fajl za brskanje po mnemonikih. Samo se pa strinjam da je to rahlo nadležno.

Brane2 ::

V bistvu mi ni padlo na pamet, da bi probal.

Code::Blocks predstavljajo kot C/C++ razvojno orodje in tudi pri recimo "New File" opcijah ti stvar ponudi kvečjemu template za header, C ali C++ source, nič več.

Nisem se pa smonil tega, da vdelani Editor očitno pozna več sintaks, saj sem z njimi pregledoval med drugim tudi Makefile datoteke pa še marsikaj drugega.

Sem šel rvnoikar preverit na "Edit"->"Highlight Mode" in je not od asmjev samo "Hitachi asm" in "MASM"...
On the journey of life, I chose the psycho path.

Brane2 ::

Pa tudi zaenkrat ni ravno helpful.

Stvar pošteka, kdaj je vpisan mnemonik veljaven, to pa je tudi vse.

autocompletion ne dela nič bistvenega...

[EDIT]: Autocompletion DELA. Le da sem pozabil, da pričakuje mnemonike v ne-Intel sintaksi.

Kewl.
On the journey of life, I chose the psycho path.

Zgodovina sprememb…

  • spremenil: Brane2 ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C programiranje (strani: 1 2 3 )

Oddelek: Programiranje
14126762 (17058) amacar
»

Sprejet standard C++11

Oddelek: Novice / Ostala programska oprema
4010775 (8857) Bistri007
»

asm - vnos stevilk s tipkovnice

Oddelek: Programiranje
51190 (1046) scarymovie
»

[Assembler] scanf How-To

Oddelek: Programiranje
61498 (1425) c0dehunter
»

Code completion pri zastonjskih Ide-jih

Oddelek: Programiranje
161799 (1464) Gundolf

Več podobnih tem