2015-04-21 3 views
2

Я изучал сборку и вчера нашел код для отрицания значения 160 бит (именно там я нашел его здесь ->https://courses.engr.illinois.edu/ece390/books/artofasm/CH09/CH09-5.html).Отрицание значения 160 бит

Это:

Value   dword 0,0,0,0,0  ;160 bit integer. 
       . 
       . 
       . 
       mov  eax, 0 
       sub  eax, Value 
       mov  Value, eax 
       mov  eax, 0 
       sbb  eax, Value+4 
       mov  Value+8, ax 
       mov  eax, 0 
       sbb  eax, Value+8 
       mov  Value+8, ax 
       mov  eax, 0 
       sbb  eax, Value+12 
       mov  Value+12, ax 
       mov  eax, 0 
       sbb  eax, Value+16 
       mov  Value+16, ax 

Я не знаю, если я не достаточно хорош при сборке или этот код содержит некоторые ошибки. Посмотрите на 6-ой линии (считая от первого мов работы):

5. sbb  eax, Value+4 
6. mov  Value+8, ax 

В случае, если не шестой вид линии так:

mov  Value+4, eax 

Я не понимаю, почему мы мов используя только менее 16 бит eax для значения и почему он напрямую перемещается в Value + 8 вместо Value + 4.

Может ли это объяснить это?

+2

Это ошибка. Ты прав. –

+2

И в последующих строках: 'ax' должен быть' eax'. –

ответ

1

Да, 6-й строке должно быть, как Вы предложили, и ниже всех «топор» должен быть «EAX»:

Вот правильный код в синтаксисе FASM:

  mov  eax, 0 
      sub  eax, [Value] 
      mov  [Value], eax 
      mov  eax, 0 
      sbb  eax, [Value+4] 
      mov  [Value+4], eax 
      mov  eax, 0 
      sbb  eax, [Value+8] 
      mov  [Value+8], eax 
      mov  eax, 0 
      sbb  eax, [Value+12] 
      mov  [Value+12], eax 
      mov  eax, 0 
      sbb  eax, [Value+16] 
      mov  [Value+16], eax 

Замена mov eax, 0 с mov eax, edx и в цене еще одного используемого регистра, код будет меньше и немного быстрее на некоторых процессорах:

  xor  edx, edx 
      xor  eax, eax 
      sub  eax, [Value] 
      mov  [Value], eax 
      mov  eax, edx 
      sbb  eax, [Value+4] 
      mov  [Value+4], eax 
      mov  eax, edx 
      sbb  eax, [Value+8] 
      mov  [Value+8], eax 
      mov  eax, edx 
      sbb  eax, [Value+12] 
      mov  [Value+12], eax 
      mov  eax, edx 
      sbb  eax, [Value+16] 
      mov  [Value+16], eax 
+1

Нет, пример «some_ONE» намного больше, чем ваш. Помните CPU в инструкции 'not', читайте ОЗУ, отрицайте значение и записывайте обратно значение в ОЗУ, команда' adc' аналогична, поэтому мы читаем 2 раза и пишем 2 раза за один шаг. В примере «some_ONE» мы получаем доступ к ОЗУ только два раза за шаг, 1 чтение и 1 запись. –

+0

Проверьте оба примера. Ваш пример медленнее примерно на 40%! –

+0

@ GJ. Да ты прав. Ответ отредактирован, согласно испытаниям. :) – johnfound

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