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

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

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

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: 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 осуществляет передачу параметров.
        Это всего-навсего тестовый пример, который я пытался перевести на 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 -
                Пытаюсь вызвать сишную 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 -
                    Цитата
                    Как-то так (не проверял):
                    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 на Исходники, дружище! ;)
                      Только зачем реанимировать тему годичной давности? :-?
                        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:
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0335 ]   [ 15 queries used ]   [ Generated: 28.03.24, 20:22 GMT ]