所以我在我的一个寄存器中保存一个介于0和9之间的整数,我试图用它的二进制表示替换寄存器中的这个值。
我在考虑使用移位方法来做,但我不太确定,
有人能指出我正确的方向吗?
由于
答案 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,48
或sub 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.