2016-09-30 2 views
-2

Как перевести этот C# код в сборе с помощью петель и/или скачковLooping на ассемблере

 int sum = 0; 
     int count = 15; 

     while (count != 0) 
     { 
      if (count % 2 != 0) 
       sum = sum + count; 
      count--; 
     } 

     Console.WriteLine(sum); 
+3

Лучшее место для начала - изучить набор команд для желаемой платформы, а затем использовать соответствующий ассемблер для генерации кода. –

+0

Я как бы удивляюсь, что вас озадачивает, потому что это можно перевести почти с 1: 1 в x86 инструкции ASM (я предполагаю x86, поскольку вы не указали целевой ЦП), так это просто недоверие к попробуйте сделать это, или вы даже не увидели набор инструкций вообще (попробуйте сначала установить 80286 или 80386, он содержит все основные инструкции, не нужно изучать весь современный x86 набор со всеми расширенными вещами, такими как SSE или с плавающей точкой в ​​начале). Попробуйте хотя бы что-нибудь, и расскажите, что вы сделали, было бы легче узнать, где проблема, и что предложить ... – Ped7g

+0

Другой вид ответа на этот вопрос: записать его как действительный C++ (просто удалите Консоль) и скомпилируйте с помощью переключателя «на сборку». Компиляторы C/C++ неплохо подходят для сборки. – Ped7g

ответ

0

«а», как правило,

L_repeat: 
    compare while_condition 
    jumpIfFalse L_exit 

    ... loop body ... 

    jump L_repeat 
L_exit: 

также для если, вы должны инвертировать условие:

compare if_condition 
jumpIfFalse L_skip 

... inside if 

L_skip: 

то, что вам нужно регистрам, один, чтобы держать ваш подсчет, один на сумму, и выйти с чем-то вроде этого :

mov Rsum,0 
mov Rcount,15 

L_repeat: 
    cmp Rcount,0 
    jz L_exit   ; jump if not (Rcount != 0) gets jump if Rcount==0 
     mov Rtemp, Rcount 
     and Rtemp, 1 
     jz L_skip 
     add Rsum, Rcount 
    L_skip: 
     dec Rcount 
     jmp L_repeat 
l_exit:  
Смежные вопросы