我有个问题! 我想将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时,没有输出显示。
请帮忙! 谢谢!
答案 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'