2011-06-22 2 views
1

Этот код сборки:Ассамблея в код C

cmp [Variable1], 10 
jae AlternateBlock 
call SomeFunction 
jmp AfterIfBlock 
cmp [Variable1], 345 
jne AfterIfBlock 
call SomeOtherFunction 

равна этому C код ?:

if (variable1 >= 10) 
{ 
    goto AlternateBlock; 
    SomeFunction(); 
    goto AfterIfBlock; 
} 
else if (Variable1 != 345) 
{ 
    goto AfterIfBlock; 
    SomeOtherFunction(); 
} 

ответ

4

Нет, это, вероятно, больше, как это:

if (variable1 < 10) 
    SomeFunction(); 
else if (Variable1 == 345) 
    SomeOtherFunction(); 

Но вы» вы не включили метки в свой ассемблер, поэтому я не могу быть уверен. Я предположил, что этикетки такие:

cmp [Variable1], 10 
    jae AlternateBlock 
    call SomeFunction 
    jmp AfterIfBlock 
@@AlternateBlock: 
    cmp [Variable1], 345 
    jne AfterIfBlock 
    call SomeOtherFunction 
@@AfterIfBlock: 
+0

Я думаю, что у вас есть вторая ошибка. –

+0

@Mike Да, я только что заметил, что при проверке снова. Благодарю. –

0

Нет, это не так. Если variable1 меньше 10, код сборки будет вызывать SomeFunction, и код C не будет, он будет прыгать на AlternateBlock

+0

Но почему? если переменная1 <10, jae не прыгает, если выше или равно? –

+0

@Thanos: Да, поэтому переменная bacause меньше 10, она НЕ будет прыгать в любом месте и перейдет к следующему оператору, который вызывает функцию someFunction –

+0

Я имею в виду, что JAE не является, если (> =)? –

5

более лаконично:

if(variable1 < 10) { 
    SomeFunction(); 
} else if(variable1 == 345) { 
    SomeOtherFunction() 
} 

Объяснение:

cmp [Variable1], 10 
jae AlternateBlock  ; if variable1 is >= 10 then go to alternate block 
call SomeFunction  ; else fall through and call SomeFunction(). ie. when variable1 < 10 
jmp AfterIfBlock  ; prevent falling through to next conditional 
cmp [Variable1], 345 
jne AfterIfBlock  ; if variable1 is not equal to 345 then jump to afterifblock 
call SomeOtherFunction ; else fall through to call SomeOtherFunction 

Если вам потребуется некоторое время, чтобы понять это, вы должны увидеть, что он семантически эквивалентен C-коду. Возможно, это помогает.

cmp [Variable1], 10 
jb @f 
call SomeFunction 
jmp end 
    @@: 
cmp [Variable1], 345 
jnz end 
call SomeOtherFunction 
    end: 
+0

Большое спасибо. –

Смежные вопросы