【问题标题】:Outputting registers to the console with MASM使用 MASM 将寄存器输出到控制台
【发布时间】:2011-08-17 01:27:09
【问题描述】:

有一天我开始学习 ASM,我已经完成了一些教程,甚至成功地将教程内容修改为使用 jmp 和 cmp 等,而不是 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 教程中的第一个示例,但这似乎完全不同 (?)。

【问题讨论】:

    标签: windows assembly masm


    【解决方案1】:

    这个代码是微软自己提供的

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

    请注意,此代码在 16 位系统上输出 AX 寄存器。但是您可以理解,您只需通过循环遍历每个字符将 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

    【讨论】:

    • 所以你是从最低位到最高位打印?
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多