На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Для обсуждения создания операционных систем (ОС) используйте раздел Обсуждаем новые идеи.

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

Не забывайте также про главные ПРАВИЛА ФОРУМА!
Участники форума, нарушающие правила, будут наказываться, а вносящие вклад в развитие форума - награждаться (DigiMoney и прочими радостями).

Приятного вам общения! ;)
Модераторы: Jin X, Qraizer
  
> Перевод из x32 в x64
    Всем доброго времени суток!
    Подскажите как корректно перевести такой простенький 32-разрядный код, под 64-разряда:
    ExpandedWrap disabled
      ...
      _Format BYTE "Test %s!", 10, 13, 0
      ...
      call readName ;здесь я читаю строку с консоли
      lea ebx, _Format
      push eax
      push ebx
      call printf ;а здесь, вывожу ее на экран
      add esp, 8
      ...

    делаю так:
    ExpandedWrap disabled
      ...
      _Format BYTE "Test %s!", 10, 13, 0
      ...
      lea rbx, _Format
      push rax
      push rbx
      call printf
      add rsp, 8
      ...

    но вылетает на:
    ExpandedWrap disabled
      call printf


    Заранее спасибо!
      OS2_, слишком мало данных. Нужно знать каким образом printf осуществляет передачу параметров.
      Цитата TheMachine @
      т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
        Это всего-навсего тестовый пример, который я пытался перевести на 64-бита. Вот полный листинг asm файла:
        ExpandedWrap disabled
          %if ASM_WIN64
          %else
          .686
          .MODEL FLAT, C
          .STACK
          %endif
          .DATA
          .CODE
          _Format BYTE "Test %s!", 10, 13, 0
          .CODE
          EXTRN  printf : proc
          EXTRN  readName : proc
           
          sayHello PROC
          call readName; eax = readName()
           
          %if ASM_WIN64
          ;printf(rbx,rax)
          lea rbx, _Format
          push rax
          push rbx
          call printf
          add rsp, 8
          %else
          ;printf(ebx,eax)
          lea ebx, _Format
          push eax
          push ebx
          call printf
          add esp, 8
          %endif
           
          ;retn
          sayHello ENDP
           
          asm_finit PROC
          finit
          ret
          asm_finit ENDP
           
          END
          Т.к. 64-битные регистры длиной в 8 байт, то (по аналогии) надо ж наверное к RSP добавлять 2*8 = 16 байт, а не 8. :scratch:
            Славян
            Пробовал и так делать.
            Но вылетает именно при вызове printf...
              OS2_, так printf-то откуда???? Я все ответа на мой вопрос не вижу. Ты сишную printf пытаешься вызвать?

              Добавлено
              Вообще, если речь о вызове функции для яву, то в x86-64 обычно параметры передаются через регистры, а не стек.
              Сообщение отредактировано: shm -
              Цитата TheMachine @
              т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                Пытаюсь вызвать сишную printf, в 32 битной версии она отлично вызывается и ей передаются все аргументы.
                  Для тех, кто в танке, сишные функции в x86-64 передают параметры через регистры, а не через стек как у тебя.
                  План действий:
                  1 Скомпилируй обычную сишную программу с printf.
                  2. Открой в дизассемблере, найти вызов printf (для mingw элементарно с gbd).
                  3. Из ассемблерного листинга запомни через какие регистры передаются параметры.
                  4. Повтори тоже самое в своей asm-программе.
                  5. PROFIT

                  Добавлено
                  Как-то так (не проверял):
                  ExpandedWrap disabled
                    ...
                    push rbp
                    lea rdi, format; формат строки
                    mov rsi, rax; 1 параметр
                    mov rax, 0
                    call    printf  
                    pop rbp
                    ...
                  Сообщение отредактировано: shm -
                  Цитата TheMachine @
                  т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
                    Цитата
                    Как-то так (не проверял):
                    ExpandedWrap disabled
                      CollapsedWrap disabledLine numbers off
                      ...
                      push rbp
                      lea rdi, format; формат строки
                      mov rsi, rax; 1 параметр
                      mov rax, 0
                      call    printf  
                      pop rbp
                    а проверить стоит! для целочисленных параметров должно быть так
                    ExpandedWrap disabled
                      sub rsp,20h <--для 4-х и менее параметров
                      mov r9,3-й_параметр
                      mov r8,2-й_параметр
                      mov rdx,1-й_параметр
                      lea rcx,строка_содержащая_формат
                      call printf
                      add rsp,20h
                      Цитата Mikl___ @
                      sub rsp,20h <--для 4-х и менее параметров
                      Может, 28h всё-таки? :whistle:
                      С учётом call'а.

                      p.s. Welcome на Исходники, дружище! ;)
                      Только зачем реанимировать тему годичной давности? :-?
                      Tell me would you kill to save a life?
                      Tell me would you kill to prove you're right?
                      Crash, crash, burn, let it all burn
                      This hurricane's chasing us all underground...
                        Jin X,
                        "учет калла" происходит при входе в программу (push reg/enter 0,0/sub rsp,8), а далее каждая функция обрамляется sub rsp,X*10h/add rsp,X*10h для 4 и менее параметров X=2; для 5/6 Х=3; для 7/8 Х=4 и т.д.
                        А тему поднял потому как отвечать пока некому :scratch: а некрофилов я и сам не люблю :jokingly:
                          Тогда сделаем пометку, что "20h – с учётом того, что push rbp/enter 0,0/sub rsp,8 (нужно подчеркнуть) уже сделан" ;)
                          p.s. Да, тут у нас в разделе тишь да гладь... :unsure:
                          Tell me would you kill to save a life?
                          Tell me would you kill to prove you're right?
                          Crash, crash, burn, let it all burn
                          This hurricane's chasing us all underground...
                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script Execution time: 0,1186 ]   [ 14 queries used ]   [ Generated: 28.07.17, 13:13 GMT ]