Вывод регистров на консоль с помощью MASM - PullRequest
1 голос
/ 17 августа 2011

Я однажды изучаю ASM, и я сделал несколько учебных пособий, и даже успешно изменил содержание учебных пособий, чтобы использовать макросы MIFM .if и. While вместо файлов MASM .if и. While.

Я решил попробовать написать что-то очень и очень простое, прежде чем продолжить работу с более продвинутыми учебниками.Я пишу генератор чисел Фибоначчи.Вот источник, который у меня есть:

.386
.model flat, stdcall

option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.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

Я собираюсь проверить наличие переполнений в eax / ecx, но сейчас я просто заинтересован в отображении значений eax / ecx на экране.

Я знаю, как извлечь адрес константной строки из .data и вызвать StdOut, который был первым примером в учебном пособии hello world, но это выглядит совсем иначе (?).

1 Ответ

3 голосов
/ 17 августа 2011

Этот код предоставлен самой Microsoft

http://support.microsoft.com/kb/85068

Обратите внимание, что этот код выводит регистр AX в 16-битных системах.Но вы можете понять, вам просто нужно преобразовать значение AX в символы ASCII, просматривая каждый символ.Пропустите часть прерываний и используйте функцию StdOut.

 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.

См. Также здесь:

http://www.masm32.com/board/index.php?PHPSESSID=fa4590ba57dbaad4bc44088172af0b49&action=printpage;topic=14410.0

...