Сборка в коде C - PullRequest
       6

Сборка в коде C

1 голос
/ 22 июня 2011

Этот код сборки:

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();
}

Ответы [ 3 ]

5 голосов
/ 22 июня 2011

Более кратко:

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:
4 голосов
/ 22 июня 2011

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

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 голосов
/ 22 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...