为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不使用c库printf的情况下在汇编级编程中打印整数?

如何在不使用c库printf的情况下在汇编级编程中打印整数?

如何在不使用c库printf的情况下在汇编级编程中打印整数?有人能告诉我纯装配以十进制格式在寄存器中显示值的代码?请不要建议使用打印黑客,然后与GCC一起编译。描述:嗯,我对NASM做了一些研究和实验,我想我可以使用c库中的printf函数来打印一个整数。通过使用GCC编译器编译对象文件,我做到了这一点,一切都很公平。但是,我想要实现的是打印存储在十进制形式的任何寄存器中的值。我对DOS命令行的中断向量021h进行了一些研究,它可以显示字符串和字符,而2或9在AH寄存器中,数据在DX中。结论:我发现的任何示例都没有展示如何在不使用C库的printf的情况下以十进制形式显示寄存器的内容值。有人知道如何在组装过程中做到这一点吗?
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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

你必须假设某个地方会在你选择的输出设备上打印一个字符。调用此子例程“print_字符”;假设它在EAX中接受字符代码并保存所有寄存器。(如果您没有这样的子例程,那么您还有一个额外的问题,应该是另一个问题的基础)。

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

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

然后,您可以调用print_string来打印数字字符代码。

要输出任意值,您需要取出数字并打印出来。

从根本上说,去除数字需要与10的力量一起工作。最简单的方法是使用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

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


查看完整回答
反对 回复 2019-07-08
?
隔江千里

TA贡献1906条经验 获得超10个赞

不能评论,所以我这样发回复。@Ira Baxter,完美答案-我只想补充一句,你不需要除以10次,因为你把寄存器CX设置为值10。只需在ax中除数,直到“ax=0”为止。

loop1: call dividebyten
       ...
       cmp ax,0
       jnz loop1

您还必须在原始数字中存储有多少位数。

       mov cx,0
loop1: call dividebyten
       inc cx

不管怎么说,IraBaxter帮助了我,只有几种方法可以优化代码:)

这不仅是关于优化,而且是格式化。当你想打印54号时,你想打印54而不是0000000054:)


查看完整回答
反对 回复 2019-07-08
  • 3 回答
  • 0 关注
  • 809 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信