我试图用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
答案 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。