2013-10-23 2 views
2

VM 언어를 Intel x86 어셈블리 언어 (MASM)로 번역하는 변환기를 작성하려고합니다. 불행히도 lt (보다 작음), gt (보다 큼) 또는 eq (같음)에 대한 적절한 변환을 찾을 수는 없지만 명령어 세트에 이와 비슷한 것이있을 것으로 기대합니다. 내가 찾을 수있는 가장 가까운 것은 cmp (비교)와이어서 조건 점프였습니다. 그러나 점프 없이는 아무것도.Intel x86 어셈블리 - lt, gt, eq

예를 들어

(X> 1, X < 3)한다면 내가 번역 할 ... VM의 코드는

push local 0 
push constant 1 
gt 
push local 0 
push constant 3 
lt 
and 
if-goto IF_TRUE0 

내 문제처럼 뭔가 내가 모르는 지금의 모습에 gt와 lt를 번역하면 점프가 바로 뒤 따르지 않고 오히려 단일 점프 조건의 일부가됩니다.

+3

컴퓨터는 일반적으로 작동 방법은 다음과 같습니다

pop ax ; this is X pop cx ; this is Y xor dx,dx ; set edx to 0 cmp cx,ax jle some_label mov dx,1 some_label: push dx 

당신이 "setgt"명령을 사용할 수 있습니다 32 비트 코드를 사용. –

+1

조건부 점프 *는 인텔 CPU의 어셈블리 수준에서 if/else 문과 루프를 구현하는 데 사용됩니다. 너 정확히 뭐야? –

+0

또 다른 옵션은'.if'와 같은 내장 매크로를 사용하는 것입니다. 자세한 내용은 http://stackoverflow.com/a/15351291/56778을 참조하십시오. –

답변

3

다른 조건부 점프를 사용하십시오. 순진 번역은 번역기가 비교가 번역하는 방법을 알아 내기 위해 단지 gt/lt 운영 및 인수보다 조금 더 볼 필요가 무언가

 cmp local0, 1 
     jle .L1 
     cmp local0, 3 
     jge .L1 
     ;; code of true case 
.L1: 

같은 참고가 될 것입니다.

예 "GT"을 위해 : 당신은 자동으로 번역을하려면

+0

고마워요! 그게 제가 생각할 수있는 유일한 방법이지만, 조금 복잡해 보였습니다. 이미 언급했듯이 좀 더 살펴볼 필요가 있습니다. 그게 가장 쉬운 방법인가요? x86 어셈블리에서 plain lt/gt가 실제로 존재하지 않습니까? – CGFoX

+0

아니요. 그러나 원하는 경우 조건에서 0 또는 1을 생성 할 수 있습니다 ('setcc'사용). 이는 좀 더 천천히 실행되지만 코드 생성 작업은 좀 더 쉬울 수 있습니다. – gsg

+0

위의 코드는 AND에서 작동하지만 두 조건 x> 1, x <3이 OR과 연결된 경우 어떻게됩니까? 나는 쉬운 해결책이있을 것이라고 확신하지만, 지금은 아무 것도 생각할 수 없다. – CGFoX

0

당신이 "있다"명령이 어떻게 작동하는지에 대해 생각해야 (당신은 JIT 컴파일러 같은 것을 쓰고 싶은)

Stack before: X, Y, ... 
Stack after: 1, ... if (X<Y) 

하나의 "LT"명령어에는 여러 개의 x86 명령어가 필요합니다. 예 :

pop eax ; this is X 
pop ecx ; this is Y 
xor edx,edx ; set edx to 0 
cmp ecx,eax 
setgt dl 
push edx