Мне здесь не хватает чего-то очевидного, но я не могу найти конец строки.Руководство по Null-Termination в Unix с использованием сборки Intel x86 (адрес и значение в операндах памяти)?
Мой код начинается с несколько звонков, которые гласят:
; read user input
;
mov eax, SYSCALL_READ ; read function
mov ebx, STDIN ; Arg 1: file descriptor
mov ecx, buf ; Arg 2: address of buffer (buffer is input)
mov edx, BUFLEN ; Arg 3: buffer length (defined as 256)
int 080h
mov [rlen], eax ; save length of string read
Профессор дал нам программу оболочки, чтобы работать с, но я получил довольно хорошую ручку на большинство из них. Что бросает меня в том, что я был впечатление, что rlen должен теперь содержать длину строки, я использую, но когда я печатаю следующее:
mov byte[esi + rlen], 92 ; add a zero
Я получаю Segfault. То же самое, если я использую [buf + rlen]. Ни buf, ни ESI сами по себе не являются segfault, поэтому мне кажется, что rlen не делает то, что я думаю.
Любой, кто может помочь мне разобраться, что происходит?
В вашем коде не отображается ввод указателя буфера в 'esi'. Вы уверены, что это то, на что он настроен? И как перемещение «92» добавляет нуль? Если позже в коде вы обрабатываете строку таким образом, который предполагает нулевое завершение, это может зайти за допустимое пространство памяти. – lurker
О, да, плохо. Я использовал обратную косую черту как простой способ увидеть, оказал ли я какое-либо влияние на строку. Что касается ESI, то я снова плохой; строка «mov esi, buf» - это строка, расположенная выше, где я работал. –