Problemy początkującego w NASM

0

Przed chwilą zacząłem naukę NASMa, uczę się stąd http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs01.htm.
Fajny kurs, jedyny minus, że dla DOS-a, a nie Win32, ale poszukałem trochę o różnicach i myślę, że dam radę.
Pierwszy mój problem jest taki, że nie wiem jak dostać adres segmentu z danymi.

segment .data
	msg db "Hello world!$"
	
segment .code
main:
	mov ah, 9
	mov edx, msg
	mov eax, data
	mov ds, eax
	int 21h
	
	mov ah, 0
	int 16h
	
	mov ah, 4C00h
	int 21h

Ale nie działa, i nie mam zielonego pojęcia co wpisać zamiast data w instrukcji mov eax, data. Widziałem nawet gdzieś w manualu NASMa dokładnie takie samo coś, ale nie pamiętam gdzie to było.
Z góry dzięki i liczę na szybką pomoc.

0

DS jest rejestrem 16-biotowym, wiec nie mozesz kopiowac wartosci z EAX do niego.
Co do hello world to wyglada tak pod Linuksem, na Windowsa wystarczy zmienic przerwania, a offset otrzymujesz za pomoca odjecia od poczatku kodu, czyli $, etykiete, czyli adres i zapisujesz jako equ:

section .text
global _start
_start:
        xor     eax, eax
        mov     al, 0x4
        xor     ebx, ebx
        mov     bl, 1
        mov     ecx, msg
        mov     edx, lmsg
        int     0x80

        xor     eax, eax
        mov     al, 0x1
        xor     ebx, ebx
        int     0x80

section .data
        msg     db      "Hello world!"
        lmsg    equ     $ - msg
0

W przypadku generowania pliku *.com musisz brać pod uwagę to iż nie warto stosować żadnych segmentów czy sekcji ponieważ cały program jest zawsze umieszczany w jednym segmencie. Tak więc twój program powinien wyglądać tak:

org 0x100
        mov ah, 9
        mov dx, msg
        int 21h
       
        mov ah, 0
        int 16h
       
        mov ax, 4C00h
        int 21h

        msg db "Hello world!$"

Kompilowane nasm.exe -f bin nazwa_pliku.asm -o nazwa_pliku.com

W programach uruchamianych z plików *.com na wejściu zawsze masz rejestry CS i DS ustawione na ten sam segment.

0

I właśnie o to chodzi, że ja nie chcę .com!!! Win32 czyli .exe, z segmentami. </quote>

0

Do autora, widzisz ja Ci podalem kod jak to ma wygladac na Linuksie, zeby z tego miec exe pod windowsem zostawiasz szkielet, a zamieniasz przerwania na te co Nevar napisal i kompilujesz.
Twoj kod nie dziala, poniewaz nie ma nigdzie identyfikatora/symbolu o nazwie data oraz z drugiego powodu, ktory podalem w poscie wyzej.

0

Jak to nie ma? segment .data to co w takim razie jest?
Ale czekaj, powoli.

section .text
global _main
_main:	
	mov eax, msg
	
	mov ah, 4Ch
	int 21h
	
section .data
	msg db "Hello WOrld!$"

Dlaczego to po uruchomieniu się zawiesza?

0

I w ogóle opis tego przerwania jest taki: AH = 09h
DS:DX -> '$'-terminated string

Więc nic mi nie da przekopiowanie tego adresu do rejestru edx
0

Znaczy się tak to miało być:
Under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
Więc coś do teog DS muszę przesunąć.
</asm>

0
section .text
global _start
_start:
        xor     eax, eax
        mov     ah, 9
        xor     ebx, ebx
        mov     bl, 1
        mov     edx, msg
        mov     edx, lmsg
        int     21h

        xor     eax, eax
        mov     ax, 4C00h
        xor     ebx, ebx
        int     21h

section .data
        msg     db      "Hello world!"
        lmsg    equ     $ - msg

Takie coś nie działa.

0

Dobra, zalogowałem się, żeby już tak nie spamować, teraz będę edytował.

Chyba coś robię źle, bo nawet takie coś:

section .text
global _start
_start:
        mov     ax, 4C00h
        int     21h

section .data

Nie działa...

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