На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Взять модуль элементов массива из 3 элементов. , Берётся только первого элемента(
    ExpandedWrap disabled
                      mov cx, 3
              lea esi, a
       
              cicl1 :
       
              mov eax, [esi]
              test eax, eax
              jns m1
              neg eax
              mov[esi], eax
              m1 :
              cmp esi, 11
              jg metka1
              add esi, 4
              metka1 :
              loop cicl1

    Массив задаётся в C++ (int a[3]), это вставка ассемблерная. Тут только у первого элемента берется модуль, у двух последующих остаётся минус. Подскажите что тут не так.
      Как минимум, ESI у вас - адрес, а потому надо сравнивать с 11 не адрес ("cmp ESI,11"), а некое количество (ECX?).
      Вместо "mov EAX, [ESI]" можно использовать lodsd (и не надо будет прибавлять каждый раз "add ESI, 4").
        Это 32-битный код? Тогда ECX, а не CX.
        Как вариант (с lodsd):
        ExpandedWrap disabled
            cld
            lea esi,a
            mov edi,esi
            mov ecx,3
          again:
            lodsd
            test eax,eax
            jns m1
            neg eax
          m1:
            stosd
            loop again


        ExpandedWrap disabled
            test eax,eax
            jns m1
            neg eax
          m1:

        можно упростить до:
        ExpandedWrap disabled
          m1:
            neg eax
            jl m1


        Добавлено
        Блок
        ExpandedWrap disabled
                          cmp esi, 11
                          jg metka1
                          add esi, 4
          metka1:
        вообще не имеет смысла (кроме add esi,4), т.к. если даже изменится ESI на последнем цикле, ничего страшного.
        Но я бы не использовать ESI вообще (как и EDI, EBX), т.к. их нужно сохранять/восстанавливать.

        Лучше всего так (и коротко, и быстро):
        ExpandedWrap disabled
            mov ecx,2
          next:
            mov eax,[a+ecx*4]
            cdq
            xor eax,edx
            sub eax,edx  ; эти 3 строки – abs(eax) без jcc-инструкций
            mov [a+ecx*4],eax
            dec ecx
            jns next
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0215 ]   [ 16 queries used ]   [ Generated: 18.04.24, 11:48 GMT ]