Nasm为数组增加了价值

时间:2016-12-17 23:49:33

标签: python assembly nasm

我有个问题! 我想将python代码转换为nasm。 这是python代码:

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

这是我得到的:

    SECTION .bss
            Y: resb 30
            i: resb 30
   asm_main:
   ......
   mov edx,-1
   mov ecx,dword 6
   Y_loop:
      inc edx
      mov [Y + edx],edx
      cmp edx,ecx
      je Y_loop_end
      jmp Y_loop
   Y_loop_end:
   mov eax,Y
   call print_string

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

请帮忙! 谢谢!

2 个答案:

答案 0 :(得分:1)

您的字符串BuffferedReader包含Y,不可打印。

答案 1 :(得分:0)

你在内存中做了什么,让我们假装一些魔术确实将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,然后mov会修改内存,如下所示:

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

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

edx不是6时,则代码循环,所以再次使用相同的指令,在第二次迭代中将内存修改为:

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

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

Y: 00 01 02 03 04 05 06 00 00 00 CC CC  ; (0xCC = 204)
;        ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^  mod in next 4 loops

看起来mov [Y+edx],dl对你来说可能就够了,除非你想要6之后的三个零。那只会存储单个字节。

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

但它与python版本几乎相同,只有6插入,而range(6)仅为0 .. 5

但是你没有展示如何输出那些python数字数组。我很确定有一些隐含的“int to string”转换。这不是Assembly中的选项,在汇编中你的字节值是你的字节值,所有的解释都留给你,没有隐含的恶作剧发生。

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

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

BTW,如果我想在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'