2017-01-29 2 views
1

왜 이런 방식으로 가스 작동 .equ 지시하지 않습니다EQU 지시어는

.equ Mark64, 8(%rsi) 

그것을이 (주에서 작동하는 동안 : .text 섹션, Mark32이 위치하고, R로 설정 /에서 w 이 경우) :

Mark32 EQU DWORD PTR [ESI + 4] 

은 어떻게 가스 Mark64 일 (.set도 작동하지 않습니다)를 할 수 ?

미리 감사드립니다.

+2

사전 처리 된 어셈블리와 '#define'을 사용하십시오. 또는'.equ Mark64, 8 '과 같은 오프셋을 정의한 다음, 예를 들어'Movl Mark64 (% rsp), % eax'를 할 수 있습니다. – Jester

+0

@fuz있어? '.equ'는 텍스트 대체가 아닌 심볼을 정의하고'8 (% rsp)'는 심볼에 유효한 값이 아니기 때문에 작동하지 않습니다. – Jester

+0

@fuz, 네, 시도했습니다. 쉼표는 오타입니다. 여전히 작동하지 않습니다. –

답변

-1

데이터 섹션 : Mark64_x 코드 섹션에서 단지 레이블입니다

MarksTable: 
    .quad Mark64_1 
    .quad Mark64_2 
    .quad Mark64_3 

. (일부 조립 언어에서

callq *0x8(%rsi) 
+0

'movq MarksTable, % rsi'는 첫 번째 요소의로드입니다. 'lea MarksTable (% rip), % rsi' 또는'mov $ MarksTable, % esi'를 사용하십시오. 또는 더 좋게,'call * 8 + MarksTable (% rip)'. –

0

예를 들어 MASM을 :이 같은 rsi에서 예를 들어 Mark64_2에 액세스 할 수 있습니다 결국

movq MarksTable, %rsi 

:

는 그리고 난 그냥 레지에 내 MarksTable을 배치 한) equ은 대체 텍스트입니다.

그러나 GAS에서 .equ은 MASM에서 foo = 3과 같은 숫자 상수입니다. 텍스트 대체의 경우 C 사전 처리기 #define Mark64 8(%rsi)을 사용하십시오. 파일 이름을 foo.S으로 지정하여 gcc가 어셈블하기 전에 CPP를 통해 실행합니다.

equ 또한 숫자 조립시 상수를 정의하고 %define을 텍스트 대체에 사용합니다. 8(%rsi)에 Mark64을 정의


그리고 BTW는 나쁜/혼란 생각처럼 보인다. 사람들은 실제로 레지스터 참조를 포함하기 위해 심볼 이름처럼 보이는 것을 기대하지 않습니다. 의미있는 이름으로 숫자 마법 상수 8을 정의하는 것이 좋을 수도 있습니다.