在程序集中迭代字符串(NASM)

时间:2016-11-17 03:25:03

标签: string memory assembly nasm memory-address

我试图用NASM汇编语言计算字符串argv [1]的长度。我想我正走在正确的轨道上。我已经将argv [1]的地址移动到寄存器eax,现在我想逐字节地移动它并与空字符串终止符进行比较。

每次我运行代码时,它都会在null比较上发生段错误。我没有得到正确的内存索引吗?

*免责声明:这是大型家庭作业的一小部分。

segment .bss

N: resd 1                 ;counter for size of argv[1]

segment .text
  global asm_main

asm_main:
  enter 0,0               ;setup
  pusha                   ;save all registers

  mov eax, dword [ebp+8]  ;argc to eax

  mov ebx, dword [ebp+12] ; address of argv to ebx
  mov eax, dword [ebx+4]  ; address of argv[1] to eax

  mov [N], dword 0        ; N = 0 

  .loop:

    add eax, [N]          ; advance index by N
    cmp eax, dword 0      ; check for end of string
    je .endloop           ; break out of the loop if we're done


    add [N], dword 1      ; N++    

    jmp .loop             ; loop back for next char

  .endloop:

popa
mov eax, 0
leave
ret

1 个答案:

答案 0 :(得分:3)

经过一些提示和gdb的帮助后,循环现在看起来像这样:

  mov [N], dword 0        ; N = 0 

  .loop:

    cmp [eax], byte 0     ; check for end of string
    je .endloop    

    add eax, dword 1      ; advance index by 1 byte
    add [N], dword 1      ; N++    

    jmp .loop             

  .endloop:

使用N来增加索引是愚蠢的。我需要增加1。