如何以十六进制打印寄存器的内容

时间:2010-06-07 18:17:42

标签: nasm

我目前正在开始使用NASM并且想知道如何使用十六进制的NASM输出寄存器的内容。 我可以用

输出eax的内容
section .bss
    reg_buf: resb 4
.
.
.
print_register:
    mov [reg_buf], eax
    mov eax, SYS_WRITE
    mov ebx, SYS_OUT
    mov ecx, reg_buf
    mov edx, 4
    int 80h
    ret

假设eax包含0x44444444,则输出将为“DDDD”。显然,每对“44”被解释为“D”。我的ASCII表批准了这一点。

但是如何让我的程序输出实际的寄存器内容(0x44444444)?

2 个答案:

答案 0 :(得分:1)

这就是我被教导的方式..

.
.
SECTION .data
numbers: db "0123456789ABCDEF" ;; have initialized string of all the digits in base 16
.
.
.
  ;;binary to hex

mov al , byte [someBuffer+someOffset] ;; some buffer( or whatever ) with your data in
mov ebx, eax  ;; dealing with nybbles so make copy for obtaining second nybble

and al,0Fh   ;; mask out bits for first nybble
mov al, byte [numbers+eax] ;; offset into numbers is the hex equiv in numbers string
mov byte [someAddress+someOffset+2], al
;;store al into a buffer or string or whatever it's the first hex number

shr bl, 4 ;; get next nybble
mov bl, byte [numbers+ebx] ;; get the hex equiv from numbers string
mov byte [someAddress+someOffset+1], bl
;;place into position next to where al was stored, this completes the process,
;;you now have your hexadecimal equivalent output it or whatever you need with it
.
.
.

答案 1 :(得分:0)

您需要先将寄存器格式化为文本字符串。最简单的API可能是itoa,然后是您的写入调用。您需要为此分配一个字符串缓冲区才能工作。

如果你不想在汇编中这样做,你可以制作一个快速的C / Python / Perl / etc程序来从程序中读取并输出所有输出文本。