
ASSEMBLER - nacitanie mena suboru a jeho otvorenie
Zdravim ... nacital som meno suboru a ked ho chcem otvorit (urcite taky mam v projekte) proste napise ze taky subor neexistuje. Mam pocit ze zle nacitavam nazov suboru preto ho to nenajde (znak naviac alebo daco take)
;NACITANIE MENA SUBORU
zadaj_sub:
call clrscr
nacitaj_sub:
vypis uvod_sub ;pomocny vypis
mov ah,0ah ;funkcia DOS na nacitanie retazca
mov dx,OFFSET subMeno ;do dx=zaciatok retazca
int 21h ;prerusenie
cmp subMeno[1],0 ;test ci je prazdny
jz prazdny_sub
xor bx,bx
mov bl,[subMeno+1] ;do bl=skutocnu velkost retazca
mov [subMeno+bx+2],'$' ;na koniec retazca pridaj '$'
jmp menu_vypis
prazdny_sub: ;ak bol zadany prazdny retazec tak skusi nacitat retazec znovu
call clrscr
vypis prazdny_ret
jmp nacitaj_sub
daj sem cely program, a uzavri to do CODE sekcie nech tam ostanu medzery. Ale uz z toho utrzku vidim ze je to maglajz na n-tu, tak to bude asi ujma na zdravi :/
ajaj :/ to ma mrzi no snazim sa co mozem nenavidim assemblery :D vypisuje mi to chybu a vypise chyba_sub co je v tretom kode
DATA SEGMENT:
NACITANIE NAZVU SUBORU:
;na koniec retazca pridaj '[/code]
jmp menu_vypis
prazdny_sub: ;ak bol zadany prazdny retazec tak skusi nacitat retazec znovu
call clrscr
vypis prazdny_ret
jmp nacitaj_sub [/code]
OTVORENIE SUBORU:
inac len tak BTW. na x86 existuje movzx t.j. nemusis robit
xor dx, dx
mov dl, neco
ale rovno mozes napisat
movzx dx, neco ;ak neco je byte. Ak to je nejaky register ako adresa tak tam drbnes BYTE PTR[register] nech prekladac vie ze to je byte parameter.
mam subor textak halo.txt a ked to tam zadam ze halo.txt stale nic nejde :/ a spravil som to tak ako si poradil :/ nemalo by tam byt \0 namiesto iba 0 alebo v uvodzovkach ci?
Ma tam byt 0, ziadne uvodzovky.
Skus si trebars napevno
potom sa stane co?
Program spustas z jakej zlozky a si vobec v DOSe a ne vo Windows? halo.txt je v ktorej zlozke?
P.S> dos programy by mali ist aj v 32bitovych win, int21 samozrejme emuluje Win.
P.S.2. DS register dufam nemenis nikde, ak ano tak ho musis nastavit nazad jak bol.
Pise to uplne to iste :/ dal som mov dx,offset buffer
Program spustas z jakej zlozky? Jak presne to spustas?
... a ano ma tam byt offset buffer to mas dobre.
BTW. Neni ten halo.txt nahodou uz otvoreny inym programom? Skus ho premenovat.
subor je presne v tej zlozke v akej mam obj asm aj exe su tam spolu vsetky skusil som aj premenovat a nic :/ ja nechapem vobec ze preco sa to deje ... :(
Spustam to cele cez GUI Turbo Assembler aj run
GUI to spusta z inej zlozky. Spust si cmd a vlez tam cez cd prikaz a spust si exe. potom ti to pojde.
Pracovna zlozka neni ta kde je exe ale moze byt ina v zavislosti na tom ze jak sa to spusta.
Napr. ak som v zlozke C:\
a napisem
test\program\neco.exe
tak spustim neco.exe ale pracovna zlozka je C:\ a subory sa hladaju v C:\
!!!
aha :/ to ma mohlo napadnut :( ale bohuzial ak to chcem cez CMD spustit vypise to:
This version of E:\...\zad1.exe is not compatible with the version of Windows you're running. Check your computer's system information and then contact the software publisher. Hmm neda sa na tom IDE nejako nastavit aby to bralo ten textak? :/
Neviem jak spusta ten gui DOS programy, to mas 64bitove windows a v nom turbo assembler ci co??? To ale tak nefunguje.
P.S. ale skus si za prve pozriet nastavenia projektu tam je pracovna zlozka pre spustanie debugovanie apod, a za druhe mozes si dat ten .txt subor do vyssiej zlozky o jedno apod to je zvycajne to spravne.
Ked sa chces vyhnut problemom so zlozkou tak si daj nazov suboru plnu cestu
buffer DB 'C:\neco\neco\neco.txt',0
ani s plnou cestou to nejde :D :D :D toto je hrozne :/ myslis ze by bol problem ak mam projekt na externom Hard disku? ked namiesto C: davam E:? Ci?
Neviem kde mas problem ale skusil by som si na tvojom mieste stiahnut dosbox, a tam si to skus spustit priamo to exe z DOSboxu.
V dosboxe si mozes namapovat ten virtualny C: dosboxu na akukolvek zlozku HDD.
jasne chapem idem to skusit dakujem :) ozvem sa ci to pojde :)
http://devdocs.inightmare.org/x86-assembly-dos-fil e-inputoutput/
toto proste musi fungovat (OFFSET tam mozes pridat to zavisi od compilera):
uz o funguje s DOS Boxom :) dakujem ti velmi pekne :)