【问题标题】:converting a decimal/hex value in a register to ascii将寄存器中的十进制/十六进制值转换为 ascii
【发布时间】:2012-04-12 02:04:54
【问题描述】:

假设我在寄存器 ebx 中有这个值:30303420

我想转换它并打印出相应的 ascii 值。所以应该打印出来

004

30  == 0
30  == 0
34  == 4
20  == space character.

如何将其打印在屏幕上?

这是 80x86 架构,使用汇编代码。

【问题讨论】:

  • 取决于操作系统和您要使用的方法,您可以对要链接此代码的任何库进行 bios 调用或库函数调用,或直接对视频卡进行编程等等。不过,这与汇编语言没有太大关系。
  • 我认为你不明白我在做什么:/
  • 你没有解释你想做什么。您需要指定您的环境。
  • 在汇编代码中,我需要什么将寄存器中的小数转换为 ascii 字符
  • 好吧,您的寄存器中没有“十进制”,您已经将它作为 ascii 保存,因此您不必转换它。

标签: string assembly ascii


【解决方案1】:

嗯,你的问题有几个不清楚的细节。

1- 如果你在 ebx 中有 30303420 Hex 值,那么你有 4 个 Ascii 字符,正好是“004”,即:

mov ebx,30303420H       ;is exactly the same than:
mov ebx,"004 "

你没有任何十进制值(最多一个?),所以这里没有任何转换。

2- 如果您想在屏幕上显示该 ebx 值,因此它显示“004”,那么您必须指定您的程序将在哪个操作系统下运行才能使用相应的服务。例如,如果你想使用旧式的 MS-DOS INT 21H 函数,它也运行在 Windows 的 DOS 窗口中,那么这个段就是这样做的:

mov     cx,4        ;counter = 4 characters
    ;
next:
rol     ebx,8       ;rotate left EBX 1 byte: place next char in BL
mov     dl,bl       ;DL = char to show
mov     ah,2        ;AH = VIDEO OUTPUT function
int     21H         ;DOS kernel service Int: show the char
loop    next        ;repeat 4 times

但是,如果你的程序在 Linux 下运行,那么显示 ebx 值的方法就完全不同了。此外,您的程序可能以不同的方式使用 C 库函数,或者是与 Windows 兼容的程序,或者使用 BIOS INT 10H 服务(负责屏幕),甚至直接访问视频电路等...

【讨论】:

  • 你在哪里发现rol指令随着BL旋转?
  • @flyer:也许在任何x86 CPU architecture 参考手册中? bl: Low 8 bits of ebx
  • 我现在明白了。不知何故将此与shld 指令混合在一起。 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2011-07-28
相关资源
最近更新 更多