문제

AT & T 어셈블리에서 인텔 어셈블리로 다음을 번역하려고합니다.

pushl 2000

이제 이것은 다음과 같이 컴파일합니다.

ff 35 d0 07 00 00       pushl  0x7d0

그러나 내가 무엇을 시도하든 Intel Synax에서는 똑같이 얻을 수 없습니다.

intel asm
disassembly after compiling to at&t

push 2000
68 d0 07 00 00          push   $0x7d0

push [2000]
68 d0 07 00 00          push   $0x7d0

push dword ptr [2000]
68 d0 07 00 00          push   $0x7d0

push dword ptr 2000
68 d0 07 00 00          push   $0x7d0

그래서 나는 단서를 벗어났습니다. "Pushl 2000"과 동등한 것은 무엇입니까?

도움이 되었습니까?

해결책

원래 코드가 당신이 생각하는 일을하지 않는다고 생각합니다. MSDEV에 따르면 분해는 다음과 같습니다.

003AFCFC FF 35 D0 07 00 00 push        dword ptr ds:[7D0h] 

푸시와 동일합니다.

*((DWORD*)2000)

값 2000을 스택으로 밀지 않습니다. 그러나 - 그것이 당신이 정말로 원하는 것이라면, 지시는 다음과 같습니다.

push dword ptr ds:[2000]

ds: 사용하라는 표시입니다 ds 세그먼트 레지스터. 세그먼트 레지스터는 불쾌한 16 비트의 날로 보류됩니다. 주요 것입니다 cs - 코드 세그먼트, ds - 데이터 세그먼트 및 ss - 스택 세그먼트 (및 fs 스레드 로컬이 저장되는 곳). 그것들을 메모리에 기본 오프셋으로 생각하십시오. 기본적으로 데이터 액세스는 꺼져 있습니다 ds 분절.

이유에 대한 내 추측 push dword ptr [2000] 작동하지 않았다는 것은 컴파일러가 그것이 당신이 그것을 사용하고 '고정'하기가 어리석은 일이라는 것을 깨달았다는 것입니다. 사용을 강요함으로써 ds 접두사는 당신이 실제로 메모리 액세스를한다는 것을 의미합니다.

다른 팁

나를 위해, GNU 어셈블러 2.18, 32 비트 대상의 경우

.intel_syntax
push dword [2000]

생성 :

0:   ff 35 d0 07 00 00       pushl  0x7d0

그리고 NASM의 경우 :

push dword [dword 2000]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top