Assembly 将整数转换为senary[Base6]ASCII格式

Assembly 将整数转换为senary[Base6]ASCII格式,assembly,ascii,x86-64,nasm,Assembly,Ascii,X86 64,Nasm,我对如何准确实施这一点有疑问。我正在尝试将一个整数转换为ASCII格式的senary值 ; Macro to convert integer to senary value in ASCII format. ; Call: int2senary <integer>, <string-addr> ; Arguments: ; %1 -> <integer>, value ; %2 -> <string&

我对如何准确实施这一点有疑问。我正在尝试将一个整数转换为ASCII格式的senary值

;  Macro to convert integer to senary value in ASCII format.

;  Call:  int2senary    <integer>, <string-addr>
;   Arguments:
;       %1 -> <integer>, value
;       %2 -> <string>, string address

;  Reads <string>, place count including NULL into <count>
;  Note, should preserve any registers that the macro alters.
mov eax, %1 
mov r9d, 6 
convLoop: 
   div r9d 
   add edx, 48 
   push edx 
   cmp eax, r9d 
   jge convLoop 
;宏将整数转换为ASCII格式的二进制值。
;  电话:int2senary,
;   论据:
;       %1->,值
;       %2->,字符串地址
;  读取,将包含NULL的计数放入
;  注意,应保留宏更改的所有寄存器。
mov eax,%1
mov r9d,6
convLoop:
分区r9d
加上edx,48
推式edx
cmp-eax,r9d
jge-convLoop
关于此代码的几点: a在执行
DIV
之前,您需要清除
EDX

b只要
EAX
不是0,迭代就必须继续

c您需要计算推送的次数。否则,在将结果存储到字符串中时,您将如何知道以后要执行多少个
pop
-s

适用于守则:
6
一起使用,而不是与
10
一起使用。Base6只需要数字,不需要字母,所以您不需要引入表查找或其他类似Base16的特殊功能。这是64位代码。您不能
推送edx
,只能
推送dx
推送rdx
。通常,您需要
rdx
,但是每个数字8个字节是很多的。当然,如果您关心效率,您根本不会推送/弹出,而是减少一个指针,一次存储一个字节。(然后,如果您需要将其与缓冲区的开头对齐,请使用
movupsxmm0、[mem]
或其他方法将其移动到位。)
  mov  eax, %1
  mov  r9d, 6
  xor  ecx, ecx     ; (c)
convLoop:
  xor  edx, edx     ; (a)
  div  r9d
  add  edx, 48
  push edx
  inc  ecx          ; (c)
  test eax, eax     ; (b)
  jnz  convLoop     ; (b)