Сборка Как перевести код операции DIV в код C - PullRequest
0 голосов
/ 14 октября 2011

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

Я посмотрел то руководство по Intel, которое опубликовал Алекс, мне кажется довольно чуждым http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2a-2b-instruction-set-a-z-manual.html

Так что я подумал, что знаю, как работает простой DIV код операции.Так как это просто divide в конце концов.У меня не было проблем с добавлением ADD, SUB, конечно, IMUL были проблемы, которые вы, ребята, помогли мне в этом.Кажется, DIV относится к той же категории, что и IMUL по уровню сложности.

Ну, без использования руководства, просто выполняю тесты для самостоятельной отладки с OllyDbg.

Я обнаружил, что ответ делениявсегда хранится в EAX.Выяснил, остальное также хранится, кто знал, хранится в EDX.

Который из изучения этого алгоритма чрезвычайно важен, кто знал, что кто-то использовал бы остаток от деления случайных чисел, чтобы сгенерировать переход от 0-10 довольно умный ... Но все же мой вопрос.

Это уже странно, я никогда не думал, что шестнадцатеричные числа деления будут иметь остатки, десятичные точки даже не принадлежат им.

DIV ECX

будет похоже на

regs.d.eax /= regs.d.ecx;
regs.d.edx = regs.d.eax % regs.d.ecx;

Я думал, может бытьсначала получим остаток ... будут просто вещи.

regs.d.edx = regs.d.eax % regs.d.ecx;
regs.d.eax /= regs.d.ecx;

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

Хорошо, хорошо .. глядя на тот код C, который я там поместил .. вероятно, придется хранить как EAX, так и ECX до деления во временных переменных .. или сделать остатоксначала код, потом второй код деления.Я не знаю.

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

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

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

Одна вещь, которую вам не хватает в вашем угаданном алгоритме, это то, что DIV обычно делит 2N бит на N битов, то есть, когда вы делаете DIV ECX, вы делите 64-битное значение без знака, содержащееся в EDX: EAX, на 32- битовое значение без знака в ECX. Затем частное сохраняется в EAX, а остаток в EDX.

Следует также помнить о возможности переполнения деления (в этом случае EDX> = ECX является условием для этого) и пометить, что инструкция изменена в регистре EFLAGS.

0 голосов
/ 14 октября 2011

Я думаю, что достаточно справедливый перевод будет:

  int16_t a=42,b=7;
  int16_t div = a/7;
  int16_t remainder = a - (div*b);

На практике это может или не может быть эквивалентным remainder = a % b (мне нужно поискатьстандартные характеристики).Будет еще интереснее, если вы внимательно рассмотрите, что происходит с отрицательными числами.

Все это говорит о том, что десятичная точка никогда не вступает в игру, поэтому я не понимаю, почему вы упоминаете об этом в посте.

возможно, это невозможно сделать в одну строку [...]

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

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