[asm] Kod w zmiennej

0

Witam.

.model small
.386

.data
   tekst byte "Hello, world!",0ah,0dh,"$"
   kod byte   0bah, 0ch, 0h, 0b4h, 09h, 0cdh, 21h
.stack 100h
.code
   .startup

  mov di, offset kod
  jmp di

.exit
end

W zmiennej "kod" są skompilowane następujące instrukcje

   mov dx, offset tekst
   mov ah, 09h
   int 21h

Więc program powinien wyświetlić zawartosc zmiennej "tekst", lecz nic się nie dzieje. Co jest nie tak?

0

Nie rozumiem, po co sobie tak utrudniać życie [???] Przecież w assemblerze pod DOSa( w windowsie jest tylko ze względu na budowe execa, ale teoretycznie można sobie wrzucić zmienne read-only w sekcji .code) nie ma rozróżnienia kodu i danych. Możesz sobie normalnie wpisać kod i ewentualnie jeśli potrzeba zamiast kod odwołać się do labela start

0

Ale chciałbym "wywołać" kod który znajdował by sie w zmiennej.

0

a nie latwiej tak?:

.model small
.386

.data
   tekst byte "Hello, world!",0ah,0dh,"$"
   kod:
   mov dx, offset tekst
   mov ah, 09h
   int 21h
.stack 100h
.code
   .startup

  mov di, offset kod
  jmp di

.exit
end

tylko jeszcze kwestia ustawienia segmentu...

0

Przy tym twoim kodzie są jakieś błędy bo się nawet skompilować nie da :-(
Ale powracając to mojego kodu. Co jest nie tak? Kiedyś udało mi się takie coś zrobic, a teraz gdy to potrzebuje nie moge sobie przypomnieć jak to zrobiłem [glowa]

0

Sekcja .data jest oznaczona jako niewykonywalna? (no-execute) Umieść to, od biedy, na stosie...

0

Masz, wersja pod fasma dzialajaca tak jak tego oczekujesz... od lat nie pisalem pod innym assemblerem i nie mam zamiaru zmieniac swoich przyzwyczajen. Z tego co wiedze to nie masz zbytniego pojecia o dzialaniu trybu rzeczywistego - segmenty /w sumie ja tez mam spore zaleglosci - ostatnio pod RM pisalem ze 2 lata temu bootloader/. BTW co piszesz, ze potrzebujesz tak nietypowe rozwiazania jak call miedzysegmentowy? W praktyce kazdy normalny program da sie pod RM napisac bez tego... chyba, ze piszesz wirusa :>

format MZ

entry main:start
stack 100h

segment text

   tekst db  "Hello, world!", 0ah, 0dh, "$"

  write_text:
        mov     dx, tekst
        mov     ah, 09h
        int     21h
        retf

segment main

  start:
        mov     ax, text
        mov     ds, ax
        mov     word [esp-4], write_text
        mov     word [esp-2], ax ; text
        call    far [esp-4] ; m16:16
        mov     ax, 4C00h
        int     21h  

Zadowolony?

Zapomnialbym... Zapoznaj sie z manualami intela - najlepiej bedzie jezeli zamowisz sobie w formie papierowej /oczywiscie sa darmowe/. Jak zamowic? Spojrz do gory i w prawo - jest tam taka opcja jak szukaj :> A powaznie to kiedys juz o zamawianiu pisalem.
p.s. Kodu wpakowanego do segmentu danych zmienna bym nie nazwal... ale to tak na marginesie ;)

0

Dzięki działa :-)
Pisałem w masm, nasm i jakims tam jeszcze... ale zdecydowanie ten fasm jest lepszy... tylko mam jeden problem. Gdy korzystam z tych segmentów to jak moge zaimportować jakieś funkcje z biblioteki?
W przykładach było takie coś


data import

 library kernel32,'KERNEL32.DLL',\
	 user32,'USER32.DLL',\
	 winmm,'WINMM.DLL'

 import kernel32,\
	ExitProcess,'ExitProcess'

 import user32,\
	MessageBoxA,'MessageBoxA'

 import winmm,\
	mciSendString,'mciSendStringA'

end data

Ale gdy dokleje takie coś do programu to wywala błędy. Dopiero jak zmienie na "format PE GUI 4.0" to już jest dobrze ale wywala błedy na segmentach [glowa]
Bardzo proszę o pomoc.

0

segmenty stosujesz tylko piszac pod dosa - w trybie rzeczywistym. Importy natomiast to czysto windowsowa sprawa, ale pod win masz plaski model pamieci - nie masz segmentow /sa za to sekcje ale one tylko okreslaja uprawnienia wzgledem danego kawalka pamieci/.
jezeli chodzi o formaty:
-MZ - dos
-PE - windows

1 użytkowników online, w tym zalogowanych: 0, gości: 1