gpt4 book ai didi

assembly - 将格式化为 ASCII 的大十进制数(128 位)转换为二进制(十六进制)

转载 作者:行者123 更新时间:2023-12-02 00:15:20 28 4
gpt4 key购买 nike

我希望这将是我关于此主题的最后一个问题!

我正在寻找一种方法,将编码为 ASCII 的巨大十进制数转换为 128 位十六进制(二进制)表示形式。

这些实际上是以十进制表示法表示的 IPv6 地址。

例如:“55844105986793442773355413541572575232”解析为:0x2a032f000000000000000000000000000

我的大部分代码都在 x86-32 MASM 汇编中,所以我宁愿保持这种方式,也不愿在不同语言之间切换。

我有在 python 中运行的代码,但如上所述,我希望在 x86 asm 中拥有所有内容。

最佳答案

这是两部分——将“十进制 ASCII”转换为 128 位无符号整数;然后将 128 位无符号整数转换为“十六进制 ASCII”。

第一部分是这样的:

set result to zero
for each character:
if character not valid handle "invalid character error" somehow
else
if result is larger than "max/10" handle "overflow error" somehow
result = result * 10
digit = character - '0'
if result is larger than "max - digit" handle "overflow error" somehow
result = result + digit

为此,您需要代码将 128 位整数乘以 10,比较两个 128 位整数,从 128 位整数中减去一个字节,然后将一个字节加到 128 位整数上。乘以 10;它可以(并且应该)实现为“x = (x << 3) + (x << 1)”;所以可以认为是左移和加法。

注意:我假设 32 位 80x86(基于您之前的问题)。我还将使用 NASM 语法(因为我对 MASM 语法“不太熟悉”),但它应该很容易转换为 MASM 语法

左移;您将 128 位整数分成 4(32 位) block 并使用类似的东西:

    ;esi = address of source number
;edi = address of destination number
;cl = shift count

mov edx,[esi+12]
mov eax,[esi+8]
shld edx,eax,cl
mov [edi+12],edx
mov edx,eax
mov eax,[esi+4]
shld edx,eax,cl
mov [edi+8],edx
mov edx,eax
mov eax,[esi]
shld edx,eax,cl
mov [edi+4],edx
shl eax,cl
mov [edi],eax

对于两个 128 位数字的加法:

    ;esi = address of first source number
;edi = address of second source number and destination

mov eax,[esi]
add [edi],eax
mov eax,[esi+4]
adc [edi+4],eax
mov eax,[esi+8]
adc [edi+8],eax
mov eax,[esi+12]
adc [edi+12],eax

将双字(零扩展字节)添加到 128 位数字:

    ;eax = first number
;edi = address of second number and destination

add [edi],eax
adc dword [edi+4],0
adc dword [edi+8],0
adc dword [edi+12],0

从 128 位数字中减去一个双字(零扩展字节):

    ;eax = first number
;edi = address of second number and destination

sub [edi],eax
sbb dword [edi+4],0
sbb dword [edi+8],0
sbb dword [edi+12],0

比较 128 位整数:

    ;esi = address of first source number
;edi = address of second source number

mov eax,[esi+12]
cmp [edi+12],eax
jb .smaller
ja .larger
mov eax,[esi+8]
cmp [edi+8],eax
jb .smaller
ja .larger
mov eax,[esi+4]
cmp [edi+4],eax
jb .smaller
ja .larger
mov eax,[esi]
cmp [edi],eax
jb .smaller
ja .larger
mov al,0 ;Values are equal
ret

.smaller:
mov al,-1 ;First value is smaller than second
ret

.larger:
mov al,1 ;First value is larger than second
ret

第二部分(转换为十六进制 ASCII)相当简单——主要是“对于每个字节从最高到最低;将字节转换为 2 个十六进制字符(可能使用查找表)”。您应该能够轻松找到执行此操作的代码,因此我不会在这里描述。

关于assembly - 将格式化为 ASCII 的大十进制数(128 位)转换为二进制(十六进制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133190/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com