(NASM努力学习的新手总数)
我已将第一个命令行参数放入寄存器eax中。它可以是1-20个小写字符之间的字符串。
我现在想循环遍历这个字符串,一次将一个字符复制到程序内存中的字节数组A中,并将字符串N的长度存储在内存中。在程序的这一点上,我已经检查过该字符串是一个合法的输入,并且在长度方面和案例方面都很好。
这是一个似乎不起作用的粗略结构(?):
section .bss ; uninitialized data
N resd 1 ; length of string
A resb 1 ; byte array A
section .text
asm_main:
// legal input checking code
mov edx, 0
loop2:
mov al, [eax+edx]
mov [A+edx],al
inc edx
cmp al, 0
jz done_loop2
jmp loop2
done_loop2:
mov [N], edx
call print_int
mov eax, A
call print_string
// code for jumps to errors and end of main
(我只打印大小和字符串以检查循环是否正常工作) 我得到了意想不到的输出:例如 输入“你好”给了我 -6193920 hxETmcxbt = Se6o = EACO / OA
任何帮助都会非常感谢,谢谢! :)
答案 0 :(得分:0)
我会举个例子:
global asm_main
SECTION .data
global x
mystring: db "stackoverflow",0
mystringl: equ $-mystring
array: TIMES mystringl dd 0
SECTION .text
asm_main:
enter 0,0
pusha
mov ecx, 0 ; counter
looper:
cmp byte[mystring+ecx], 0x0 ; check for end of string
je exit
mov eax, 0 ; empty eax
mov al, byte[mystring+ecx] ; move string position into al
mov byte[array+ecx], al ; write into memory
push eax
mov eax, 0
mov al, byte[array+ecx]
call print_char
call print_nl
pop eax
add ecx, 1
jmp looper
exit:
如果您需要任何帮助,请随时给我发消息。