【问题标题】:print number to screen assembly将数字打印到屏幕组件
【发布时间】:2014-12-26 03:31:18
【问题描述】:

我想将寄存器中的一个数字打印到屏幕上。此外,我想将其保存为字符串(字节)。所以如果我有一个像 150 这样的数字,我想把它保存在某个地址作为

'1'、'5'、'0'

mov ebx, dword ptr[ebp+8]
; eax contains value
; ebx contains address to store characters

; here is where conversion would take place

既然是在寄存器里,那你是不是得把它转成十进制值,然后把每一位分开?

【问题讨论】:

  • 在什么操作系统下,你允许自己使用什么库?
  • x86 窗口。我知道有多个库可用,但我是作为一个更大的准系统程序的一部分来尝试了解更多关于汇编编程的。
  • 您的意思是真正的 Windows(如图形窗口)还是 16 位 MS-DOS 子系统(如 DOS 提示符)?它们彼此完全不同。
  • 我应该更清楚。 Windows 作为完整的图形操作系统。就像我说的,我知道使用系统库解决这个问题的方法有很多,但这并不能真正教会我任何东西!

标签: assembly nasm


【解决方案1】:

我不确定如何打印 ASCII 以及如何分隔每个位置。所以我只想展示如何将 EAX 的值转换为十进制 ASCII 并将其存储到 DS:EBX 的地址。对于最大 0FFFFFFFFh 的 32 位值,我们需要一个十进制 ASCII(4294967295)的位置。例如,如果值是十进制 150,那么我们得到的 ASCII 码是“0000000150”,开头有一些“0”。

      mov     cl, 0Ah             ; counter for ten decimal ASCII's
      mov     edi, 1000000000
P1:   xor     edx, edx
      div     edi
      add     al, 30h             ; convert to ASCII
      mov     esi, edx            ; save remainder
      mov     [ebx], al           ; store ASCII to the address of DS:EBX
      inc     ebx
      mov     eax, edi
      mov     edi, 0Ah
      xor     edx, edx
      div     edi
      mov     edi, eax
      mov     eax, esi
      dec     cl
      jnz P1

【讨论】:

  • 好像没问题。但是,如果我不想要前导零,我相信你可以在除法之后添加一些东西来检查余数是否等于原始数字。 cmp edx, esi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2015-06-06
相关资源
最近更新 更多