Я пытаюсь подсчитать длину строки argv [1] на ассемблере NASM. Думаю, я на правильном пути. Я переместил адрес argv [1], чтобы зарегистрировать eax, и теперь я хочу переместить его по байтам и сравнить с нулевым терминатором строк.Iterate over strings in assembly (NASM)
Каждый раз, когда я запускаю код, он переходит на нулевое сравнение. Неужели я неправильно понял индексацию памяти?
* Отказ от ответственности: Это небольшая часть большого задания на домашнюю работу.
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
Какая инструкция на самом деле является segfault? 'add eax, [N]' читается с фиксированного адреса, поэтому, если он не будет segfault в первый раз, он не должен выполняться segfault. Используйте отладчик для одношаговой и посмотрите, что находится в regs/mem, когда вы ошибаетесь. –
Наиболее очевидной проблемой является то, что вы никогда не читаете строку, вы просто увеличиваете указатель и сравниваете его с нулем. (И вы увеличиваете eax геометрически, потому что '[N]' растет линейно.) –
Он умирает на линии cmp. Вы правы, строка, которая у меня выше, сравнивает адрес (надеюсь, адрес символа) с ожидаемым значением, а не сам символ. Должен ли я иметь cmp [eax], dword 0? – Eric