【问题标题】:masm Irvine32 library. How to print out a single bytemasm Irvine32 库。如何打印出单个字节
【发布时间】:2018-02-03 15:25:55
【问题描述】:

这个问题要求我接受一个双字并将其从小端转换为大端。我已经把那部分记下来了,但现在我需要打印出来。

对 WriteHex 的调用只会打印出整个寄存器。我还尝试使用一些数学来将我的数组的内容放入一个寄存器中,但我们仅限于使用没有循环的 mov、add 和 sub。有没有办法使用 Irvine 打印出单个字节或仅使用这些命令将数组移动到寄存器?

这就是我所拥有的

data
    bigEndian BYTE 4 DUP(?)
    littleEndian DWORD ?
    prompt BYTE "Please enter a number in HEX > ",0

.code 
main PROC
    mov edx, offset prompt
    CALL WriteString 
    CALL ReadHex
    mov littleEndian, eax
    mov al, bigEndian + 4
    mov bigEndian, al
    mov al, bigEndian + 5
    mov bigEndian + 1, al
    mov al, bigEndian + 6
    mov bigEndian + 2, al 
    mov al, bigEndian + 7
    mov bigEndian + 3, al
    ; should print here 

【问题讨论】:

  • 如果您真的想打印单个字节,请使用movzx eax, BYTE PTR someAddress 将一个字节从内存零扩展到一个 32 位寄存器中。否则,请参阅 rkhb 的回答。请注意,代码中call ReadHex 之后的所有内容都可以替换为bswap eax

标签: masm irvine32


【解决方案1】:

PTR 是用于声明或覆盖类型的 MASM 运算符。如果您想从 DWORD 变量中加载单个字节,请使用BYTE PTR。如果要从 BYTE 数组加载 DWORD,请使用 DWORD PTR

INCLUDE Irvine32.inc

.data
    bigEndian BYTE 4 DUP(?)
    littleEndian DWORD ?
    prompt BYTE "Please enter a number in HEX > ",0

.code
main PROC
    mov edx, offset prompt
    CALL WriteString
    CALL ReadHex
    mov littleEndian, eax
    mov al, BYTE PTR littleEndian + 3
    mov bigEndian + 0, al
    mov al, BYTE PTR littleEndian + 2
    mov bigEndian + 1, al
    mov al, BYTE PTR littleEndian + 1
    mov bigEndian + 2, al
    mov al, BYTE PTR littleEndian + 0
    mov bigEndian + 3, al

    mov eax, DWORD PTR bigEndian
    call WriteHex

    exit

main ENDP

END main

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多