2014-02-26 2 views
0

나는 두 개의 유사한 루프를 가지고 있는데, 여기서 나는 eax에 주소를 쓰고 그 다음에 eax에서 데이터 세그먼트로 쓰려고한다. 첫 번째 첫 번째 루프가 작동하고 두 번째 루프는 세그 폴트를 반환합니다. 왜 두 번째 루프가 잘못되어 첫 번째 루프가 잘못 되었습니까?NASM - 세그먼트 화 오류 루프

section .data 
n1: db 1 
n2: db 1 

는 [...]

n_1_1: 
mov eax,one 
mov [n1],eax 
jmp DIG2 

n_2_1: 
mov eax,one 
mov [n2],eax  ; segfault 
jmp DISP2 

답변

2

dbeax (32 비트)를 유지하기에 충분하지 않은 바이트 (8 비트)를 선언한다. 변수에 쓰기/쓰기를 시도 할 최대 값을 저장할 충분한 공간을 갖도록 모든 변수를 선언하십시오. 예를 들어

:

; declare n1 and n2 as doublewords with initial values of 1 
n1: dd 1 
n2: dd 1 
그 중 하나가 충돌하고 다른 하나는하지 않는 이유에 대해서는

; 표시 한 코드에서 실행 환경을 알지 못한다고 말하는 것은 어렵습니다. 그러나 두 번째 쓰기는 첫 번째 쓰기가 충돌을 일으키지 않았지만 충돌을 일으키기에 충분할 수 있도록 할당되지 않은 공간으로 1 바이트를 더 덮어 씁니다 (외모로 보임).

+0

당신은 완전히 옳습니다! 고맙습니다! :) – user3324099