0

我目前正在开始使用 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)?

4

2 回答 2

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
.
.
.
于 2013-02-17T23:54:42.520 回答
0

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

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

于 2010-06-07T18:22:00.557 回答