NASM kezdő paradoxon – vagy béna vok :)

Kezdőlap Fórumok Programozás NASM kezdő paradoxon – vagy béna vok :)

10 bejegyzés megtekintése - 51-60 / 67
  • Szerző
    Bejegyzés
  • #2149556
    pointux
    Felhasználó
      vargadanis 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 0x10

          mov 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
      ret

      Ezt 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 0x10

          mov ax, 0xb800
          mov es, ax
          mov ah, 0xf
          mov al, „H”
          mov [es:0x0000], ax
          int 0x10
          mov ah, 0
          int 0x16
      ret

      times 510-($-$$) db 0
      dw 0xAA55

      Ezt 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 0x10

          mov ax, 0xb800
          mov es, ax
          mov ah, 0xf
          mov al, „H” ; alias 0x48, ha jól számolom
          mov [es:0x0000], ax
          int 0x10

      1) 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…

      #2149557
      pointux
      Felhasználó
        vargadanis 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 0x10

            mov 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
        ret

        Ezt 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 0x10

            mov ax, 0xb800
            mov es, ax
            mov ah, 0xf
            mov al, „H”
            mov [es:0x0000], ax
            int 0x10
            mov ah, 0
            int 0x16
        ret

        times 510-($-$$) db 0
        dw 0xAA55

        Ezt 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 0x10

            mov ax, 0xb800
            mov es, ax
            mov ah, 0xf
            mov al, „H” ; alias 0x48, ha jól számolom
            mov [es:0x0000], ax
            int 0x10

        1) 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…

        #2149558
        pointux
        Felhasználó
          kdam 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 0xAA55
          Code:
          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éget
          #2149559
          pointux
          Felhasználó
            kdam 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 0xAA55
            Code:
            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éget
            #2149560
            vargadanis
            Felhasználó

              Hehe… 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, ax

                  mov 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 0xAA55

              Ezzel a kóddal annyi a baj, hogy a loopot nem akarja valamiért végrehajtani.. Ez miért lehet?

              már megoldottam 🙂

              #2149561
              vargadanis
              Felhasználó

                Hehe… 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, ax

                    mov 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 0xAA55

                Ezzel a kóddal annyi a baj, hogy a loopot nem akarja valamiért végrehajtani.. Ez miért lehet?

                már megoldottam 🙂

                #2149562
                pointux
                Felhasználó

                  Na, lassú voltam.. leírhatnád, hogy hogyan!

                  De vigyázz a végtelen ciklussal, mert az még linuksz alatt is eltart egy darabig. :)))

                  #2149563
                  pointux
                  Felhasználó

                    Na, lassú voltam.. leírhatnád, hogy hogyan!

                    De vigyázz a végtelen ciklussal, mert az még linuksz alatt is eltart egy darabig. :)))

                    #2149564
                    vargadanis
                    Felhasználó

                      Hehe!!

                      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 text

                      segment .data
                      msg   db    ‘Hello’, 0
                      msg_len    equ    $-msg

                      segment .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 0xAA55

                      Há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.

                      #2149565
                      vargadanis
                      Felhasználó

                        Hehe!!

                        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 text

                        segment .data
                        msg   db    ‘Hello’, 0
                        msg_len    equ    $-msg

                        segment .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 0xAA55

                        Há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.

                      10 bejegyzés megtekintése - 51-60 / 67
                      • Be kell jelentkezni a hozzászóláshoz.