char 배열을 초기화하고 싶지만,이 과정에서 프로그램이 충돌합니다. 여기char [] 초기화 실패, esi 잘못된 값 포함
void kernelEnteredMsg() {
char str[] = "Kernel successfully entered!";
}
를 분해입니다 : 여기 내 코드는이 0x402000으로 함께 ESI를로드 왜 이해가 안
push ebp
mov ebp,esp
push edi
push esi
push ebx
sub esp,byte +0x30
lea edx,[ebp-0x2d]
mov ebx,0x402000 ; load an address outside my data segment
mov eax,0x1d
mov edi,edx
mov esi,ebx ; move this address to edi
mov ecx,eax
rep movsb ; here the programm crashes
add esp,byte +0x30
pop ebx
pop esi
pop edi
pop ebp
ret
. 그러나 이것은 오류를 일으키는 것 같습니다. 누군가 여기서 일어나는 일과 그것을 고치는 방법을 설명 할 수 있습니까?
추신 : "Kernel successful entered!" 이진 파일에서 0x1000에 있습니다.
C 코드 :
void kernelEnteredMsg();
void entryPoint() {
kernelEnteredMsg();
}
void kernelEnteredMsg() {
char str[] = "Kernel successfully entered!";
int size = 28;
}
호출 어셈블리 코드 :
extern _entryPoint
global _main
section .text
_main: ; start of kernel
nop
; setup ds, es, ss and gs
mov ax, 16
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x4000
mov ax, 24
mov gs, ax
mov [gs:0], dword 0x07690748 ; test graphics
call _entryPoint ; enter kernel C code
jmp $
격리되어 있으면이 C 코드로 인해 컴파일러/링커/런타임이 손상되지 않는 한 충돌이 발생할 수 없습니다. 코드의 다른 곳에서 정의되지 않은 동작을 호출해야합니다. –
@OliCharlesworth 필요한 코드는 얼마입니까? – kaetzacoatl
@kaetzacoatl 그것은 "얼마나"에 관한 질문이 아닙니다 ... 우리는 충돌을 일으키는 코드가 필요합니다. –