Nasm为阵列增值

2024-05-29 03:17:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个nasm问题! 我想把python代码转换成nasm。 下面是python代码:

y = [];
    for i in range(6):
        y.append(i);

我得到的是:

^{pr2}$

当我运行nasm时,没有输出显示出来。在

请帮忙! 谢谢!在


Tags: 代码inforrangenasmappendpr2
2条回答

您的字符串Y包含不可打印的0x000102030405。在

在内存中执行的操作,让我们假设一些魔术将Y处的内存数组设置为204(以使代码的进度更明显):

Y: CC CC CC CC CC CC CC CC CC CC CC CC  ; (0xCC = 204)

      ...
   Y_loop:
      inc edx
      mov [Y + edx],edx

在第一次迭代中,inc将把edx修改为0,然后{}将修改内存如下:

^{pr2}$

写入四个字节,因为edx是32位(4B)寄存器。在

edx不是6时,则代码循环,因此同样的指令,在第二次迭代中将修改内存为:

Y: 00 01 00 00 00 CC CC CC CC CC CC CC  ; (0xCC = 204)
;     ^^ ^^ ^^ ^^   modified

然后它将循环几次,直到edx为6,然后退出循环,最终内存值设置为:

^{4}$

看起来mov [Y+edx],dl对您来说可能已经足够了,除非您想要6后面的三个零。它只存储单个字节。在

现在这个内存内容仍然不能在终端中直接打印,因为这些值不代表任何常见字符编码中的可打印字符。在

但它与python版本几乎相同,只是6插入,而{}只有{}。在

但是您没有展示如何输出python数字数组。我很确定有一些隐含的“int到string”转换。在汇编中这不是一个选项,在汇编中,你的字节值就是你的字节值,所有的解释都交给你了,永远不会发生任何隐含的诡计。在

因此,要将内存内容转换为"012345"ASCII编码字符串,必须添加值48= 0x30 = '0'!)。这是harold在评论中建议的,但是他修改了Y:内存内容,因此它与原来的python不同,因为内存中突然出现了“ASCII字符串”,而不是字节[0,1,2,3,4,5,6]值数组。如果您不打算用Y[k]值进一步计算,这可能会很好,因为在转换成ASCII Y[0] + Y[1] = 48 + 49 = 97 = 'a'之后,它就不再是{}。在

另一种选择是再次循环Y数组,并在内存的其他部分生成字符串,将Y保留为字节值。然后,您还可以处理需要多于一位数的值(如字节值10=>;10+48=58=':'可打印字符“冒号”),方法是将它们转换为多位数字符串。在


顺便说一句,如果我想在类似生产的代码中生成Y中的字符串“012345”(而不是学习循环、数组等),我将其编码为:

    lea   edi,[Y]  ; target buffer address
    ; try to write code into sub-routines, independent of global labels
    ; like the next two lines, which can be used to set any
    ; 6+ byte buffer to "0123456", just put address into edi
    mov   [edi],dword '0123'
    mov   [edi+4],word '45'

相关问题 更多 >

    热门问题