如何在字符串中循环并将其存储到NASM中的数组中?

时间:2015-12-04 22:00:59

标签: arrays nasm

(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

任何帮助都会非常感谢,谢谢! :)

1 个答案:

答案 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:

如果您需要任何帮助,请随时给我发消息。