내 코드에는 edx 레지스터에 문자열 길이를 수동으로 넣는 대신 문자열 길이를 계산하는 프로그램과 함께 콘솔에 인쇄 할 문자열이 있어야합니다. 하지만 문자열이 인쇄 된 직후에 이상한 문자가 인쇄됩니다.
global _start
section .text
_start:
mov edi, message
call _strlen
mov edx, eax
mov eax, 4
mov ebx, 1
mov ecx, message
int 80h
mov eax, 1
mov ebx, 5
int 80h
section .data
message: db "My name is Stanley Hudson", 0Ah
_strlen:
push ebx
push ecx
mov ebx, edi
xor al, al
mov ecx, 0xffffffff
repne scasb ; REPeat while Not Equal [edi] != al
sub edi, ebx ; length = offset of (edi – ebx)
mov eax, edi
pop ebx
pop ecx
ret
strlen
문자열을 종료하는 0 바이트를 검색하지만 문자열에 1 바이트가 없으므로 0 바이트를 찾고 너무 큰 값을 반환 할 때까지 진행됩니다.
당신은 쓰고 싶어
message: db "My name is Stanley Hudson", 0Ah, 0
; ^^^
또 다른 버그는 문자열 뒤에 돌아 가지 않았기 때문에 _strlen
함수가 .data
섹션에 분명히 있다는 것 section .text
입니다. x86-32에는 NX 비트가 없으므로 .data
섹션이 실행 가능하고 모든 것이 여전히 작동하지만 의도 한 바는 아닙니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다