gpt4 book ai didi

assembly - 如何在汇编级编程中打印整数而不使用 c 库中的 printf ? (itoa,整数到十进制 ASCII 字符串)

转载 作者:行者123 更新时间:2023-12-02 07:49:02 25 4
gpt4 key购买 nike

谁能告诉我以十进制格式显示寄存器中的值的纯汇编代码?请不要建议使用 printf hack 然后使用 gcc 编译。

描述:

嗯,我对 NASM 进行了一些研究和实验,并认为我可以使用 c 库中的 printf 函数来打印整数。我通过使用 GCC 编译器编译目标文件来做到这一点,一切都运行得很好。

但是,我想要实现的是以十进制形式打印存储在任意寄存器中的值。

我做了一些研究,发现 DOS 命令行的中断向量 021h 可以显示字符串和字符,而 2 或 9 位于 ah 寄存器中,数据位于 dx 中。

结论:

我发现的示例都没有显示如何在不使用 C 库的 printf 的情况下以十进制形式显示寄存器的内容值。有谁知道如何在汇编中做到这一点?

最佳答案

您需要编写一个二进制到十进制的转换例程,然后使用十进制数字生成要打印的“数字字符”。

您必须假设某个地方的某些东西会在您选择的输出设备上打印一个字符。调用该子例程“print_character”;假设它需要 EAX 中的字符代码并保留所有寄存器..(如果您没有这样的子例程,则会遇到另一个问题,该问题应该是另一个问题的基础)。

如果寄存器(例如 EAX)中有数字(例如 0-9 之间的值)的二进制代码,则可以通过添加“”的 ASCII 代码将该值转换为该数字的字符零”字符到寄存器。这很简单:

       add     eax, 0x30    ; convert digit in EAX to corresponding character digit

然后可以调用print_character来打印数字字符代码。

要输出任意值,您需要挑选数字并打印它们。

从根本上来说,挑选数字需要使用十的幂。使用 10 的幂(例如 10 本身)是最简单的。想象一下,我们有一个除以 10 的例程,它采用 EAX 中的值,并在 EDX 中生成商,在 EAX 中生成余数。我将其作为练习,让您弄清楚如何实现这样的例程。

然后,一个具有正确想法的简单例程是为该值可能具有的所有数字生成一位数字。 32 位寄存器可存储 40 亿个值,因此您可能会打印 10 位数字。所以:

         mov    eax, valuetoprint
mov ecx, 10 ; digit count to produce
loop: call dividebyten
add eax, 0x30
call printcharacter
mov eax, edx
dec ecx
jne loop

这有效...但以相反的顺序打印数字。哎呀!好吧,我们可以利用下推堆栈来存储生成的数字,然后以相反的顺序将它们弹出:

         mov    eax, valuetoprint
mov ecx, 10 ; digit count to generate
loop1: call dividebyten
add eax, 0x30
push eax
mov eax, edx
dec ecx
jne loop1
mov ecx, 10 ; digit count to print
loop2: pop eax
call printcharacter
dec ecx
jne loop2

留给读者的练习:抑制前导零。此外,由于我们将数字字符写入内存,因此我们可以将它们写入缓冲区,然后打印缓冲区内容,而不是将它们写入堆栈。也留给读者作为练习。

关于assembly - 如何在汇编级编程中打印整数而不使用 c 库中的 printf ? (itoa,整数到十进制 ASCII 字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com