분기 테이블에 대한 질문이 있습니다. 데이터 부문 (DS)에서어셈블러의 분기 테이블 (Nasm)
- 코드 부문 (CS)
무슨 이득이 방법의 다른 지역 : 이러한 테이블을 선언하는 방법은 두 가지가 있습니다
?
나는이 다음 예 배운 : 사례 1 :
SECTION .data
i dd 2;
stab dd m1,m2,m3 ; branchtable for switch
SECTION .text
global start
start:
mov ebx , [ i ] ; switch (i)
cmp ebx , 1 ;
jl end
cmp ebx , 3
jg end
shl ebx , 2 ; /∗ stab 4 Bytes ∗/
jmp [ stab+ebx −4];
m1: ;do something.....
....
사례 2 : 우리 교수가 우리에게 말했다
SECTION .data
i dd 2;
SECTION .text
global start
start:
mov ebx , [ i ] ; switch (i)
cmp ebx , 1 ;
jl end
cmp ebx , 3
jg end
shl ebx , 2 ; /∗ stab 4 Bytes ∗/
jmp [ cs : ebx+stab −4]; branchtable in codesegment
ALIGN 4 ;
stab dd m1,m2,m3
m1: ; do something
....
, 그 방법이가 더 effectiv하지만 왜 ? 분기 테이블에 짧은 점프가있어서 DS에 표시 할 필요가 없기 때문에?
방법은하지만, 내가 CS
사용하여 교수와 다르다고, 더 효과적입니다 당신이 다루고있는 프로세서에 따라
아마도 두 번째 경우에 캐시가 이미 stab이라는 테이블을 포함하는 메모리 위치를 프리 페치했기 때문에? –
피터와 마찬가지로, 캐시 영역과 관련이 있다고 생각하지만, 어려운 사실은 없습니다. 하지만 필자가 보았던 모든 컴파일러 생성 코드 (항상)는 항상 코드 세그먼트에 점프 테이블을 가지고 있다고 말할 수 있습니다. –
아아, 찌르다는 내용을 캐시 한'align'을 실행하기 때문에 더 효과적일까요? – destiny