Kezdőlap › Fórumok › Programozás › NASM kezdő paradoxon – vagy béna vok :)
- This topic has 66 hozzászólás, 7 résztvevő, and was last updated 17 years, 5 months telt el by
vargadanis.
-
SzerzőBejegyzés
-
2008-01-11-16:37 #2149556vargadanis wrote:Paradoxon No2 🙂
Itt van egy program, ami tökéletesen lefut:Code:[BITS 16]
[ORG 0x100]main:
mov ax, 3
int 0x10
mov ax, 0x1003
mov bx, 0
int 0x10mov ax, 0xb800
mov es, ax
mov ah, 0xf
mov al, „H”
mov [es:0x0000], ax
int 0x10; wait for any key press:
mov ah, 0
int 0x16
retEzt próbáltam win32, linux és BSD alatt futtatni. Ez igy megy.
Majd ez behal:Code:[BITS 16]
[ORG 0x7c00]main:
mov ax, 3
int 0x10
mov ax, 0x1003
mov bx, 0
int 0x10mov ax, 0xb800
mov es, ax
mov ah, 0xf
mov al, „H”
mov [es:0x0000], ax
int 0x10
mov ah, 0
int 0x16
rettimes 510-($-$$) db 0
dw 0xAA55Ezt floppyra másoltam és bochs ban próbáltam futtatni siker nélkül sajnos. Azt irta ki a Bochs, hogy Lock prefix unallowed
Ez egy bug, vagy én vagyok béna?Paradoxon? No!… Ismét no!
Lássuk mit is csinál a kódod:
mov bx, 0 ; (Megjegyzem ezt az eredményt így érdemes elérni: xor bx,bx)
int 0x10mov ax, 0xb800
mov es, ax
mov ah, 0xf
mov al, „H” ; alias 0x48, ha jól számolom
mov [es:0x0000], ax
int 0x101) Vagyis: visszaolvassa a megjelenítő tulajdonságait. (Gondolom, nem ezt akartad.)
2) Mi az a ret? Hova?Figyelni kéne, gondolkozni és nem másolni. Eredetiben, biztos valami függvény része volt, azért van az a visszatérés…
2008-01-11-16:37 #2149557vargadanis wrote:Paradoxon No2 🙂
Itt van egy program, ami tökéletesen lefut:Code:[BITS 16]
[ORG 0x100]main:
mov ax, 3
int 0x10
mov ax, 0x1003
mov bx, 0
int 0x10mov ax, 0xb800
mov es, ax
mov ah, 0xf
mov al, „H”
mov [es:0x0000], ax
int 0x10; wait for any key press:
mov ah, 0
int 0x16
retEzt próbáltam win32, linux és BSD alatt futtatni. Ez igy megy.
Majd ez behal:Code:[BITS 16]
[ORG 0x7c00]main:
mov ax, 3
int 0x10
mov ax, 0x1003
mov bx, 0
int 0x10mov ax, 0xb800
mov es, ax
mov ah, 0xf
mov al, „H”
mov [es:0x0000], ax
int 0x10
mov ah, 0
int 0x16
rettimes 510-($-$$) db 0
dw 0xAA55Ezt floppyra másoltam és bochs ban próbáltam futtatni siker nélkül sajnos. Azt irta ki a Bochs, hogy Lock prefix unallowed
Ez egy bug, vagy én vagyok béna?Paradoxon? No!… Ismét no!
Lássuk mit is csinál a kódod:
mov bx, 0 ; (Megjegyzem ezt az eredményt így érdemes elérni: xor bx,bx)
int 0x10mov ax, 0xb800
mov es, ax
mov ah, 0xf
mov al, „H” ; alias 0x48, ha jól számolom
mov [es:0x0000], ax
int 0x101) Vagyis: visszaolvassa a megjelenítő tulajdonságait. (Gondolom, nem ezt akartad.)
2) Mi az a ret? Hova?Figyelni kéne, gondolkozni és nem másolni. Eredetiben, biztos valami függvény része volt, azért van az a visszatérés…
2008-01-11-16:40 #2149558kdam wrote:Ezek váltzók gondolom.
A dw elé nem kell semmilyen azonosító?
Miért kell neked ez a két változó?Code:times 510-($-$$) db 0
dw 0xAA55Code:times 510-($-$$) db 0; ez kinullázza az adott memória részt (minden bizonnyal szükségtelen, de ártani nem árt… viszont egyes esetekben jól jöhet)
dw 0xAA55; a [b][u]bios[u][b] számára ez jelzi a véget2008-01-11-16:40 #2149559kdam wrote:Ezek váltzók gondolom.
A dw elé nem kell semmilyen azonosító?
Miért kell neked ez a két változó?Code:times 510-($-$$) db 0
dw 0xAA55Code:times 510-($-$$) db 0; ez kinullázza az adott memória részt (minden bizonnyal szükségtelen, de ártani nem árt… viszont egyes esetekben jól jöhet)
dw 0xAA55; a [b][u]bios[u][b] számára ez jelzi a véget2008-02-08-19:21 #2149560Hehe… Nah volt valami progress. 🙂
De azért még mindig elég sok kérdésem van, sajnos nem mennek a dolog olyan könnyen, mint az ember szeretné:Code:[BITS 16]
[ORG 0x7c00]%define WhiteBlack 0x0f ;macros are better for this purpose
;WhiteBlack db 0x0f ; define the black BG and white FG for text_start:
mov ax, 0xb800 ; move 0xb800 to AX register (video memory)
mov es, ax ; move 0xb800 value to ES register fr. AX register
xor ax, axmov al, ‘a’
_loop:
call _write
jmp _loop
ret
jmp _start_write:
mov byte [es:bx], al ; set char to be put out
mov byte [es:bx+1], WhiteBlack ; set BG and FG of char
add bx, 2 ; inc bx val by 2
times 510-($-$$) db 0
dw 0xAA55Ezzel a kóddal annyi a baj, hogy a loopot nem akarja valamiért végrehajtani.. Ez miért lehet?
már megoldottam 🙂
2008-02-08-19:21 #2149561Hehe… Nah volt valami progress. 🙂
De azért még mindig elég sok kérdésem van, sajnos nem mennek a dolog olyan könnyen, mint az ember szeretné:Code:[BITS 16]
[ORG 0x7c00]%define WhiteBlack 0x0f ;macros are better for this purpose
;WhiteBlack db 0x0f ; define the black BG and white FG for text_start:
mov ax, 0xb800 ; move 0xb800 to AX register (video memory)
mov es, ax ; move 0xb800 value to ES register fr. AX register
xor ax, axmov al, ‘a’
_loop:
call _write
jmp _loop
ret
jmp _start_write:
mov byte [es:bx], al ; set char to be put out
mov byte [es:bx+1], WhiteBlack ; set BG and FG of char
add bx, 2 ; inc bx val by 2
times 510-($-$$) db 0
dw 0xAA55Ezzel a kóddal annyi a baj, hogy a loopot nem akarja valamiért végrehajtani.. Ez miért lehet?
már megoldottam 🙂
2008-02-08-20:14 #2149562Na, lassú voltam.. leírhatnád, hogy hogyan!
De vigyázz a végtelen ciklussal, mert az még linuksz alatt is eltart egy darabig. :)))
2008-02-08-20:14 #2149563Na, lassú voltam.. leírhatnád, hogy hogyan!
De vigyázz a végtelen ciklussal, mert az még linuksz alatt is eltart egy darabig. :)))
2008-02-08-21:31 #2149564Hehe!!
Még linux alatt is.. Valóban 🙂
Így oldottam meg:
Code:[BITS 16]
[ORG 0x7c00]%define WhiteBlack 0x0f ;macros are better for this purpose
;WhiteBlack db 0x0f ; define the black BG and white FG for textsegment .data
msg db ‘Hello’, 0
msg_len equ $-msgsegment .text
_start:
mov ax, 3
int 0x10
mov ax, 0xb800 ; move 0xb800 to AX register (video memory)
mov es, ax ; move 0xb800 value to ES register fr. AX register
xor ax, ax
cld
mov ds, [msg]
mov al, [ds:0x00]loopWr:
call _write
cont:
call _exit_exit:
jmp _exit_write:
mov byte [es:bx], al ; set char to be put out
mov byte [es:bx+1], WhiteBlack ; set BG and FG of char
add bx, 2 ; inc bx val by 2
cmp bx, 50
js loopWr
call cont
times 510-($-$$) db 0
dw 0xAA55Hát most itt tart a „project”… Azt kell még tudni, hogy folyamat közben tanulok. Most megint leültem, hogy megnézzem sikerül-e valamit csinni.
Ham már itt vagyunk
Ha van egy byte stringem (itt az msg), akkor annak a stringnek az első bítját hogy a pikulában kapom meg? Vagy a helyét a memóriában vagy valami, hogy utána tudjak vele operálni.2008-02-08-21:31 #2149565Hehe!!
Még linux alatt is.. Valóban 🙂
Így oldottam meg:
Code:[BITS 16]
[ORG 0x7c00]%define WhiteBlack 0x0f ;macros are better for this purpose
;WhiteBlack db 0x0f ; define the black BG and white FG for textsegment .data
msg db ‘Hello’, 0
msg_len equ $-msgsegment .text
_start:
mov ax, 3
int 0x10
mov ax, 0xb800 ; move 0xb800 to AX register (video memory)
mov es, ax ; move 0xb800 value to ES register fr. AX register
xor ax, ax
cld
mov ds, [msg]
mov al, [ds:0x00]loopWr:
call _write
cont:
call _exit_exit:
jmp _exit_write:
mov byte [es:bx], al ; set char to be put out
mov byte [es:bx+1], WhiteBlack ; set BG and FG of char
add bx, 2 ; inc bx val by 2
cmp bx, 50
js loopWr
call cont
times 510-($-$$) db 0
dw 0xAA55Hát most itt tart a „project”… Azt kell még tudni, hogy folyamat közben tanulok. Most megint leültem, hogy megnézzem sikerül-e valamit csinni.
Ham már itt vagyunk
Ha van egy byte stringem (itt az msg), akkor annak a stringnek az első bítját hogy a pikulában kapom meg? Vagy a helyét a memóriában vagy valami, hogy utána tudjak vele operálni. -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz