Assembly 美国电话电报公司;ascii整数转换

Assembly 美国电话电报公司;ascii整数转换,assembly,x86-64,att,Assembly,X86 64,Att,假设我们将数字“98”存储在%r11中,使用movzbq我将第一个数字“9”存储在%r12中 作为ascii码。 我从ascii中减去$48,得到整数“9”,并将其存储在%r12中。 我将%r12添加到%r13以获取%r13中的值“9”或“0x9” 然后我将%r13乘以10,得到存储为“0x5a”的值“90” 既然%r13包含“0x5a”。我不能 movq %r13, %rdi call putchar. 因为这将打印字符“Z”(ascii表中的值90)。我如何让它打印数字“90” 你用减

假设我们将数字“98”存储在%r11中,使用movzbq我将第一个数字“9”存储在%r12中 作为ascii码。 我从ascii中减去$48,得到整数“9”,并将其存储在%r12中。 我将%r12添加到%r13以获取%r13中的值“9”或“0x9” 然后我将%r13乘以10,得到存储为“0x5a”的值“90” 既然%r13包含“0x5a”。我不能

movq %r13, %rdi
call putchar.  
因为这将打印字符“Z”(ascii表中的值90)。我如何让它打印数字“90”


你用减法得到9位数,所以打印它,然后不做任何数学运算就打印第二个0。只需在第一次打印后将ascii“0”放入寄存器,然后再次调用。请记住,putchar一次只能输出一个字符。一个寄存器中同时有多个ASCII数字是不常见的。就像您必须从字符串/缓冲区加载单词一样,因此您可以从内存中首先加载1个字节。如果要打印,只需将字节分别解压为
movzbl
(movzx)和右移8。如果要同时打印这两个字节,将它们存储到内存中并将指针传递到
fwrite(buf,1,2,stdout)
。stdio锁定开销高于存储数据并向其传递指针的存储/重新加载开销。Re:ASCII to/from integer:/I应该将值“90”存储在注册表中,然后打印出来。然而,“90”存储在十六进制“0x5a”中,我希望它打印出“0x5a”,它实际上应该打印出“90”,而不是字符“Z”(90的ascii码)。
subq $48, %r12      # Subtract $48 to convert ascii to integer.
add %r12, %r13      # add 9 to %r13
imulq $10, %r13     # multiply by 10
add %r12, %r13      # add to return value
movq %r13, %rdi 
call putchar