Assembly 将整数转换为senary[Base6]ASCII格式
我对如何准确实施这一点有疑问。我正在尝试将一个整数转换为ASCII格式的senary值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&
; 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)