» »

[NALOGA][NASM] problem pri povezovanju s C-jevskimi funkcijami

[NALOGA][NASM] problem pri povezovanju s C-jevskimi funkcijami

whatever ::

Tale vaja mi dela tezave, sem brez idej kaj naj se probam, delam v cygwinu pod windows xp. Ko skompajlam in zazenem mi javi segmentation fault (core dumped).


Besedilo vaje:

Napišite program, ki vsebino datoteke vhod.txt pretvori v velike črke in jih zapiše v datoteko izhod.txt. Uporabite klice sistemskih funkcij fopen, fread, fwrite, fclose.

Koda:

bits 32
extern _fopen, _fread, _fwrite, _fclose
global _main
section .data
r db "r",0
vhod db "vhod.txt",0
izhod db "izhod.txt",0
a db "a",0
ena dd 1
buffer times 2 db 0

section .text
_main:
enter 0,0
pusha
push r
push vhod
call _fopen
mov ebx,eax
add esp,8
push a
push izhod
call _fopen
mov edx,eax
add esp,8

push ebx
push dword [ena]
push dword [ena]
push dword buffer
call _fread
add esp,16
push edx
push dword [ena]
push dword [ena]
push dword buffer
call _fwrite
add esp,16

push ebx
call _fclose
add esp,4
push edx
call _fclose
add esp,4
popa
leave
ret

Ta koda bi naj prebrala 1 char iz začetka datoteke "vhod.txt" z fread in zapisala ta isti znak v datoteko "izhod.txt" z fwrite. Obe omenjeni datoteki imam v istem direktoriju, torej to ni problem. Kasneje bom dal tisto, kar je zapisano desno zamaknjeno v zanko in odstel fiksno vrednost od [buffer], da bom spremenil iz malih črk v velike. Vendar že ta poenostavljena koda mi dela težave; na netu sem našel ene rutine za debugiranje (koda zanje v zgornjem primeru ni vkljucena) in mi povejo, da se je v buffer dejansko shranila 1. črka iz datoteke "vhod.txt". Težava pa nastane takoj, ko vključim vrstico call _fwrite, torej takoj ko kličem fwrite; če fwrite ne klicem, potem se program skompajla in zažene brez problema, ampak seveda ne zapiše nič v "izhod.txt". Ekvivalentno kodo sem napisal tudi v C-ju in slednja deluje popolnoma pravilno.

Ekvivalentna koda v C-ju
 
#include <stdio.h>
int main() {

FILE * krneki;
krneki = fopen("vhod.txt", "r");
FILE * krneki1 = fopen("izhod.txt", "a");

int a=1;
int b=1;
char buffer[1];
buffer[0]=0;
buffer[1]=0;

 a=fread(buffer, 1, 1, krneki);
 b=fwrite(buffer, 1, 1, krneki1);
 
fclose(krneki);
fclose(krneki1);
return 0;

}

Probal sem tudi klicati _malloc iz assemblerja (seveda sem prej dal na sklad vse za malloc() potrebne parametre), da bi rezerviral prostor za spremenljivko, ampak tudi to ni delovalo. Lepo prosim, če mi lahko malce pomagate, ker bi rad dokončal to vajo tako, da bi delovala. Najlepša hvala!!
Veliko jih je notri, še več jih je pa zunaj.
Bilijarde v šole! - Ivan Kramberger
Abnormal behaviour of abnormal brain makes me normal.

CCfly ::

char buffer[1];
buffer[0]=0;
buffer[1]=0;
Tole ne bo v redu.

Poskusi tako:
char buffer[2];
buffer[0] = 0;
buffer[1] = '\0';
"My goodness, we forgot generics!" -- Danny Kalev

whatever ::

Hehe, sem pogruntal v čem je fora! Očitno funkciji fread in fwrite modificirata registre ebx in edx, torej sem ta dva registra nadomestil z esi in edi. Če bo komu kaj koristilo.
Veliko jih je notri, še več jih je pa zunaj.
Bilijarde v šole! - Ivan Kramberger
Abnormal behaviour of abnormal brain makes me normal.

64202 ::

Uhm, verjetno bi ti moral spucat svoje registre na stack preden klices kake externe c zadeve...? Kako ves, da ti ne bo enkrat tud ostalih povozlo.
I am NaN, I am a free man!

whatever ::

Po C calling convention C-jevske funkcije ne modificirajo registrov ebx, esi in edi. Ostalih pa pri tej nalogi itak ne bom rabil tako da ni panike.
Veliko jih je notri, še več jih je pa zunaj.
Bilijarde v šole! - Ivan Kramberger
Abnormal behaviour of abnormal brain makes me normal.

64202 ::

Ok, saj nimam veliko pojma o x86 :)
I am NaN, I am a free man!

c00L3r ::

Jaz pa sem danes zečel delat z NASM in mi ta lepo prevede kodo v .obj. Zdaj pa nevem kako prevest v exe? Če prevdem z gcc, ki je zraven DevC++, mi javi sledečo napako:

D:\Downloads\nasm-0.98.39-win32\nasm-0.98.39>gcc.exe hello.obj -o hello
ld: cannot open crt2.o: No such file or directory

Prevest pa hočem preprost hello world program, ta:
bits 32
extern _printf
global _main

section .data
message db "hello, world!", 10, 0

section .text

_main:
pushad
push dword message
call _printf
add esp, 4
popad
ret


Torej kako naredit exe?


Vredno ogleda ...

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

[ASM] Pomoč, ne najdem napake

Oddelek: Programiranje
51026 (902) c0dehunter
»

asm - vnos stevilk s tipkovnice

Oddelek: Programiranje
51190 (1046) scarymovie
»

[Assembler] scanf How-To

Oddelek: Programiranje
61497 (1424) c0dehunter
»

C++ datoteke

Oddelek: Programiranje
5864 (691) technolog
»

[nasm] scanf

Oddelek: Programiranje
272795 (2522) Brane2

Več podobnih tem