2014-10-03 2 views
-2

Я действительно новичок в изучении языка ассемблера и только начал его искать, поэтому мне было интересно, может быть, некоторые из вас, ребята, могут помочь мне разобраться в одной проблеме. У меня есть домашнее задание, которое говорит мне сравнить инструкции ассемблера с кодом c и сказать, какой c-код эквивалентен инструкциям по сборке. Так вот инструкции по сборке:Язык ассемблера - Как это работает

pushl %ebp // What i think is happening here is that we are creating more space for the function. 
movl %esp,%ebp // Here i think we are moving the stack pointer to the old base pointer. 
movl 8(%ebp),%edx // Here we are taking parameter int a and storing it in %edx 
movl 12(%ebp),%eax // Here we are taking parameter int b and storing it in %eax 
cmpl %eax,%edx // Here i think we are comparing int a and b (b > a) ? 
jge .L3 // Jump to .L3 if b is greater than a - else continue the instructions 
movl %edx,%eax // If the term is not met here it will return b 
.L3: 
movl %ebp,%esp // Starting to finish the function 
popl %ebp // Putting the base pointer in the right place 
ret // return 

Я пытаюсь прокомментировать его, исходя из моего понимания этого - но я мог бы быть совершенно неправильно об этом. Параметры для функций C, которые один из предполагают, чтобы быть эквивалентно являются:

int fun1(int a, int b) 
{ 
unsigned ua = (unsigned) a; 
if (ua < b) 
return b; 
else 
return ua; 
} 
int fun2(int a, int b) 
{ 
if (b < a) 
return b; 
else 
return a; 
} 
int fun3(int a, int b) 
{ 
if (a < b) 
return a; 
else 
return b; 
} 

Я думаю, что правильный ответ fun3 .. но я не совсем уверен.

+0

Мы не будем делать домашнее задание для вас, тем более, что вы совершенно не прилагаете никаких усилий. –

+2

@Puciek: На самом деле у ОП есть комментарии, которые показывают предполагаемые интерпретации генерируемых команд. –

+3

Это шутка? – drleifz

ответ

5

Прежде всего, добро пожаловать в StackOverflow. Отличное место, на самом деле.

Теперь, для начала, позвольте мне помочь; много; много.

У вас есть хорошие комментарии, которые помогут вам и мне и всем остальным, но они настолько уродливы, что чтение их болезненно.

Вот как это исправить: пробел, много его, пустые строки и группировка инструкций в небольшие группы, связанные друг с другом.

Подробнее, после условного перехода, вставьте одну пустую строку после абсолютного прыжка, вставьте две пустые строки. (Старые трюки, отлично работают для удобочитаемости)

Во-вторых, выстройте комментарии так, чтобы они были аккуратно расположены. Это выглядит в тысячу раз лучше.

Вот ваши вещи, с 90-секундным текстом, организованным мной. Поверьте, профессионалы будут уважать вас в тысячу раз лучше с этим видом исходного кода ...

pushl %ebp    // What i think is happening here is that we are creating more space for the function. 
    movl %esp,%ebp   // Here i think we are moving the stack pointer to the old base pointer. 

    movl 8(%ebp),%edx  // Here we are taking parameter int a and storing it in %edx 
    movl 12(%ebp),%eax  // Here we are taking parameter int b and storing it in %eax 


    cmpl %eax,%edx   // Here i think we are comparing int a and b (b > a) ? 
          // No, Think like this: "What is the value of edx with respect to the value of eax ?" 

    jge .L3     // edx is greater, so return the value in eax as it is 

    movl %edx,%eax   // If the term is not met here it will return b 
          // (pssst, I think you're wrong; think it through again) 

    .L3: 

    movl %ebp,%esp   // Starting to finish the function 
    popl %ebp    // Putting the base pointer in the right place 
    ret      // return 

Теперь вернемся к вашей проблеме. То, что он получает, это «смысл» инструкции сравнения и соответствующей инструкции JGE.

Вот запутывать-O-Matic вещи вы должны понимать, чтобы выжить такого рода «академических переживаний»

Это бизнес, в cmpl %eax,%edx инструкции, является одной из форм «сравнить» инструкции

Попробуйте сформировать идею что-то вроде этого, когда вы видите, что синтаксис, «... Какое значение операнда относительно исходного операнда ...?»

РИСКОВАННАЯ: Я абсолютно n o хорошо с синтаксисом AT & T, поэтому кто-то может исправить меня по этому поводу.

Во всяком случае, в этом конкретном случае, вы можете фраза идея в уме, как это ...

»... Я вижу cmpl %eax,%edx, так что я думаю: Что касается eax, значение в edx является ..."

Вы завершите эту фразу в уме с„чувством“следующей инструкцией, которая является условным переходом.

Парадигматический процесс в мозге человека работает, чтобы сформировать предложение, как это ...

«... Что касается eax, значение в edx больше или равны, поэтому я прыгаю ...»

так что, если вы правильно о местонахождении a и b, то вы c сделать парадигматический скремблер мозга и получить что-то вроде этого ...

«... Что касается значения в b, что значение в a больше или равно, так что я буду прыгать ...»

Чтобы получить представление об этом, обратите внимание, что JGE является «противоположный смысл», если вы будете, JL (то есть, «Переход, если меньше, чем»)

Хорошо, теперь это так происходит, что return в C is , связанный сret инструкция по сборке languag е, но это не одно и то же.

Когда Программисты говорят "... Эта функция возвращает Int ...", что они означают ...

  • ассемблер подпрограмма поместит значение в Eax
  • The подпрограмма будет исправить стек и положить его обратно в аккуратном порядке
  • подпрограмма будет выполнять его Ret инструкции

Еще один предмет обфускации теперь брошен вам в лицо.

Эти следующие условные переходы применимы к Подпись арифметические операции сравнения ...

  • JG
  • JGE
  • JNG
  • JL
  • JLE
  • JNL

Вот оно! Ловушка ждет, чтобы ввергнуть тебя во все это!

Вы хотите выполнить сопоставленные или неподписанные сравнения ???

Кстати, я никогда не видел, чтобы кто-нибудь делал что-то подобное первой функции, где число без знака сравнивается с подписанным числом. Это даже законно?

Так или иначе, мы помещаем все эти факты вместе, и мы получаем: Этот ассемблере рутинных возвращает значение в a если оно меньше, чем значение в b в противном случае он возвращает значение в b.

Эти значения оцениваются как знаковые целые числа.

(я думаю, что я получил это право,.. Кто-то проверить мою логику я действительно не нравится синтаксис этого монтажный на всех)

Так или иначе, я уверен, что разумно вы не хотите, чтобы спросить людей, в Интернете, чтобы предоставить вам конкретный ответ на ваш конкретный вопрос о домашнем задании, поэтому я оставлю это вам, чтобы понять это из этого объяснения.

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

О, и снова оговорку, я всегда использую синтаксис Intel (например, Masm, Tasm, Nasm, что угодно), поэтому, если у меня есть что-то назад, не стесняйтесь исправить его для меня.

+1

Отличный ответ, спасибо. Но что такое синтаксис AT & T? –

+0

Посмотрите, поможет ли эта страница понять разницу между синтаксисом Intel и AT & T ... http://asm.sourceforge.net/articles/linasm.html –

+0

Хм спасибо .. Полезно. –