如何在二进制x86汇编中返回数字?

时间:2013-11-25 17:48:59

标签: assembly binary x86

所以我在我的一个寄存器中保存一个介于0和9之间的整数,我试图用它的二进制表示替换寄存器中的这个值。

我在考虑使用移位方法来做,但我不太确定,

有人能指出我正确的方向吗?

由于

3 个答案:

答案 0 :(得分:2)

您不能通过二进制表示替换寄存器中的值,因为它已经是二进制的。

例如,如果您想获取数字的各个位以便打印它们,您可以移动并测试:

;AX holds your number. x86 architecture. MS DOS.
          mov cx,16
          or ax,ax
GetBit:   js BitOne     ;We test for SIGN bit here (MSb)
          push ax
          mov ax,0e30h  ;putchar ('0')
          int 10h
          pop ax
          jmp EndBit
BitOne:   push ax
          mov ax,0e31h  ;putchar ('1')
          int 10h
EndBit:   shl ax,1      ;shift left
          loop GetBit
          ret

答案 1 :(得分:1)

ASCII,并且通过扩展几乎所有其他常用的文本编码,使用代码48(0x30)到57(0x39)来表示数字0-9。如果从字符代码中减去48,则得到数字值...如果将数字值加48,则得到字符代码。

(您通常可以使用'0'作为48的别名,它通常会使意图更清晰。)

如果您确定它代表一个数字,您还可以and使用0x0f代码获取数字值。使用or 0x30会将0-9之间的数字转换回字符代码。但是,减法和加法具有对称性的语义优势;你使用相同的值,只是稍微不同,转换两种方式。

(如果您不确定您的寄存器是否包含介于0和9之间的值,顺便说一句,基本上任何数学将其转换为ASCII数字都会搞砸。同样,转换为对于任何不代表ASCII数字的字符代码,数字值都会搞乱。在“转换”之前知道该值是否在正确的范围内,否则您将看到“古怪”。)

答案 2 :(得分:0)

好吧,如果您的'0'是您的注册,并希望获得0(二进制零),则只需从寄存器'0'中减去sub reg,'0', reg是您选择的注册。 sub reg,48sub reg,0x30也应该有效。

示例1:

mov al,'0' ; al contains ASCII value '0': 48 in decimal, 0x30 in hexadecimal.
sub al,'0' ; subtract 48 decimal or 0x30 hexadecimal. result: al contains 0.

示例2:

mov al,'9' ; al contains ASCII value '9': 57 in decimal, 0x39 in hexadecimal.
sub al,'0' ; subtract 48 decimal or 0x30 hexadecimal. result: al contains 9.