windows - Udsender registre til konsollen med MASM

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er en dag til at lære ASM, og jeg har lavet et par tutorials, og endog med succes ændret tutorial indholdet til at bruge jmp og cmp, osv. I stedet for MASM .if og .while makroer.


Jeg har valgt at prøve at skrive noget meget, meget simpelt at begynde med, før jeg fortsætter med mere avancerede tutorials. Jeg skriver en Fibonacci nummer generator. Her er kilden jeg har hidtil:


.386
.model flat, stdcall

option casemap :none

include masm32includewindows.inc
include masm32includekernel32.inc
include masm32includemasm32.inc

includelib masm32libkernel32.lib
includelib masm32libmasm32.lib

.code
start:

  mov eax, 1
  mov ecx, 1

  \_a:

    push eax
    add  eax, ecx
    pop  ecx

    ; Jump to \_b if there is an overflow on eax

    ; Print Values Here

  jmp \_a

  \_b:

  push 0
  call ExitProcess

end start


Jeg har til hensigt at kontrollere for overløb på eax/ecx, men lige nu er jeg bare interesseret i at vise værdierne for eax/ecx på skærmen.


Jeg ved hvordan man skubber adressen til en konstant streng fra .data og kalder StdOut, som var det første eksempel i hello world tutorial, men det ser ud til at være helt anderledes (?).

Bedste reference


Der findes denne kode fra Microsoft selv


http://support.microsoft.com/kb/85068[3]


Bemærk, at denne kode udsender AX-register på 16 bit systemer. Men du kan få ideen, du skal bare konvertere AX-værdi til ASCII-tegn ved at løbe gennem hvert tegn. Spring over afbrydelsesdelen og brug din StdOut-funktion.


 mov dx, 4          ; Loop will print out 4 hex characters.
nexthex:
          push dx            ; Save the loop counter.
          mov cl, 4          ; Rotate register 4 bits.
          rol ax, cl
          push ax            ; Save current value in AX.

          and al, 0Fh        ; Mask off all but 4 lowest bits.
          cmp al, 10         ; Check to see if digit is 0-9.
          jl decimal         ; Digit is 0-9.
          add al, 7          ; Add 7 for Digits A-F.
decimal:
          add al, 30h        ; Add 30h to get ASCII character.

          mov dl, al
          ;Use StdOut to print value of dl
           ;mov ah, 02h        ; Prepare for interrupt.
          ;int 21h            ; Do MS-DOS call to print out value.

          pop ax             ; Restore value to AX.
          pop dx             ; Restore the loop counter.
          dec dx             ; Decrement loop counter.
          jnz nexthex        ; Loop back if there is another character
                             ; to print.


Se også her:


http://www.masm32.com/board/index.php?PHPSESSID=fa4590ba57dbaad4bc44088172af0b49u0026amp;action=printpage;topic=14410.0[4]