Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2014, 12:11   #11
Полный 30h
Пользователь
 
Аватар для Полный 30h
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
Полный 30h,
в моём учебнике целая глава, будет здорово, если еще и на вопросы в конце главы ответишь...
Уже читал, мало что понял. Но часто то что не догоняю сразу по прошествии времени вдруг начинает пониматься. Сейчас перечитать попробую. Спасибо.
Меня постоянно преследуют умные мысли, но я быстрее!
Полный 30h вне форума Ответить с цитированием
Старый 22.12.2014, 11:25   #12
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Полный 30h,
Код:
format PE64 GUI 5.0
entry start
include 'win64a.inc'
section '.code' code readable executable
start: sub rsp,8
       xor ecx,ecx
       mov r9d,ecx
       mov edx,msgBoxText
       mov r8d,msgBoxCaption
       call [MessageBox]
       add rsp,8
       retn
msgBoxText  db "Win64 Assembly with FASM is Great!",0
msgBoxCaption db "Iczelion Tutorial #2:MessageBox",0
data import
 
 library user32,'USER32.DLL'
 import user32,\
    MessageBox,'MessageBoxA'
 
end data
Нормально работает
Mikl___ вне форума Ответить с цитированием
Старый 22.12.2014, 14:14   #13
Полный 30h
Пользователь
 
Аватар для Полный 30h
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

А чтоб ей не работать sub rsp,8 + возврат из call = 16
Меня постоянно преследуют умные мысли, но я быстрее!
Полный 30h вне форума Ответить с цитированием
Старый 23.12.2014, 09:37   #14
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Полный 30h,
еще два рабочих варианта
  1. Код:
    format PE64 GUI 5.0
    entry start
    include 'win64a.inc'
    section '.code' code readable executable
    start: push rax
           xor ecx,ecx
           mov r9d,ecx
           mov edx,msgBoxText
           mov r8d,msgBoxCaption
           call [MessageBox]
           pop rax
           retn
    msgBoxText  db "Win64 Assembly with FASM is Great!",0
    msgBoxCaption db "Iczelion Tutorial #2:MessageBox",0
    data import
     
     library user32,'USER32.DLL'
     import user32,\
        MessageBox,'MessageBoxA'
     
    end data
  2. Код:
    format PE64 GUI 5.0
    entry start
    include 'win64a.inc'
    section '.code' code readable executable
    start: enter 0,0
           xor ecx,ecx
           mov r9d,ecx
           mov edx,msgBoxText
           mov r8d,msgBoxCaption
           call [MessageBox]
           leave
           retn
    msgBoxText  db "Win64 Assembly with FASM is Great!",0
    msgBoxCaption db "Iczelion Tutorial #2:MessageBox",0
    data import
     
     library user32,'USER32.DLL'
     import user32,\
        MessageBox,'MessageBoxA'
     
    end data
Фразу
Цитата:
А чтоб ей не работать sub rsp,8 + возврат из call = 16
не понял
Mikl___ вне форума Ответить с цитированием
Старый 23.12.2014, 12:56   #15
Полный 30h
Пользователь
 
Аватар для Полный 30h
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

Цитата:
Фразу не понял
Ну это я к тому что условие по выравниванию стека на 16 байт выполняется. Собственно как и в двух твоих примерах.
1. push rax эквивалент sub rsp,8 что с call (ещё один sub rsp,8) даёт в сумме смещение rsp на 16
2. enter 0,0 даёт push rbp которое по сути всё то же sub rsp,8
т.е. в принципе любая хуерга перед функцией колбасящая стек на кратность 8 дает нам возможность корректно войти в функцию.

Мне вот в свою очередь непонятны некоторые твои моменты
1.
xor ecx,ecx
mov r9d,ecx
mov edx,msgBoxText
mov r8d,msgBoxCaption

почему такая разнопёрка с регистрами, понятно что майкрософт функции передрал на голубом глазу с 32 битных, однако чисто гепотетически те же данные msgBoxText, msgBoxCaption могут лежать на адресах за 4 Гб и тогда код начнёт бажить на ровном месте.

2. Непонятно за каким интересом вставлена команда retn она же по сути ни чем не предварена что бы корректно отработать, вернет же черти куда. Равно как и отсутствие выделение стека под функции переданные через регистры. Как я понял это будущий туториал и всё должно быть по канонам.
У меня вот как бы только так заработало с retn
Код:
format PE64 GUI 5.0
entry start
include 'win64a.inc'
section '.code' code readable executable
start: 
sub rsp,8
mov rax,$
push rax
        push rax
       xor rcx,rcx
       mov r9,rcx
       mov rdx,msgBoxText
       mov r8,msgBoxCaption
       call [MessageBox]
       pop rax
retn
msgBoxText  db "Win64 Assembly with FASM is Great!",0
msgBoxCaption db "Iczelion Tutorial #2:MessageBox",0
data import
 
 library user32,'USER32.DLL'
 import user32,MessageBox,'MessageBoxA'
 
end data
3. По мелочи. Почему
xor rcx,rcx
mov r9,rcx

всё через xor разве не красивше?
Меня постоянно преследуют умные мысли, но я быстрее!

Последний раз редактировалось Полный 30h; 23.12.2014 в 12:58.
Полный 30h вне форума Ответить с цитированием
Старый 23.12.2014, 14:54   #16
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Полный 30h,
поясняю, при работе с младшей частью 64-разрядного будет происходить знаковое расширение 32-разрядной младшей части на весь 64-разрядный регистр
Код:
кодировка      |команда    |длина команды
---------------+-----------+---------------
31С9           |xor ecx,ecx| 2 байта но RCX=0
4831C9         |xor rcx,rcx|тут уже 3 байта
48C7C200000000 |mov rcx,0  | а здесь все 7 байт
4189C9         |mov r9d,ecx| здесь выигрыша нет, везде по 3 байта
4989C9         |mov r9,rcx |
4D31C9         |xor r9,r9  |
FASM создает заголовок PE64 с полем Image base равным 0000000000400000h поэтому для передачи адреса переменной можно использовать 32-разрядный регистр
Код:
BA37104000      |mov edx,msgBoxText  | 5 байт
488D1515000000  |mov rdx,msgBoxText  | 7 байт
48C7C237104000  |lea rdx,[msgBoxText]| 7 байт
Цитата:
Непонятно за каким интересом вставлена команда retn она же по сути ни чем не предварена что бы корректно отработать, вернет же черти куда.
а вот и нет - retn поместит в rip адрес TerminateProcess, поэтому вызов ExitProcess здесь не нужен

Последний раз редактировалось Mikl___; 23.12.2014 в 17:02.
Mikl___ вне форума Ответить с цитированием
Старый 23.12.2014, 17:30   #17
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
       xor ecx,ecx
       mov r9d,ecx
Это, наверное, создаёт лишнюю зависимость значения r9 от rcx, не?
Somebody вне форума Ответить с цитированием
Старый 23.12.2014, 18:00   #18
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Somebody,
две этих инструкции можно разделить mov rdx,msgBoxText/mov r8,msgBoxCaption да и задачи вывода мессаджбокса с оптимизацией по скорости изначально не стояло
Mikl___ вне форума Ответить с цитированием
Старый 23.12.2014, 22:34   #19
Полный 30h
Пользователь
 
Аватар для Полный 30h
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
а вот и нет - retn поместит в rip адрес TerminateProcess, поэтому вызов ExitProcess здесь не нужен
Даже не знаю, каким образом retn поместит из TerminateProcess, если верить интернетам она выколупывает из стека адрес возврата из ПП. У меня после нажатия кнопки Ок и схлопывания окна программа висит в процессах неприлично долго. Что до заморочек с 32 битными регистрами с целью экономии пары байт, то на мой взгляд овчинка выделки не стоит. Когда ресурсы компьютера исчисляются гигабайтами выигрыш в размере выглядит не таким большим плюсом по сравнением с растущей вероятностью допустить в коде какую либо ошибку с обрезанием половины переменной или адреса.
Меня постоянно преследуют умные мысли, но я быстрее!
Полный 30h вне форума Ответить с цитированием
Старый 24.12.2014, 09:02   #20
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Даже не знаю, каким образом retn поместит из TerminateProcess, если верить интернетам она выколупывает из стека адрес возврата из ПП.
Посмотри под отладчиком содержимое верхушки стека при старте программы, моя семерка содержит адрес ExitUserThread, WindowsXP содержала TerminateProcess, что у тебя ХЗ
Цитата:
Что до заморочек с 32 битными регистрами с целью экономии пары байт, то на мой взгляд овчинка выделки не стоит. Когда ресурсы компьютера исчисляются гигабайтами выигрыш в размере выглядит не таким большим плюсом по сравнением с растущей вероятностью допустить в коде какую либо ошибку с обрезанием половины переменной или адреса
Тогда имеет смысл писать программы на MS Visual или C# а ассемблер -- это вылизывание каждого байта и погоня за каждым тактом
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi: аппроксимация функций методом базиса из финитных функций Denna Помощь студентам 1 12.03.2012 19:23
Лицензионное соглашение Photoshop CS4 VistaSV30 Софт 5 13.12.2009 10:21
Соглашение о кодировании .NET SunKnight Общие вопросы .NET 3 08.11.2009 19:01
Лицензионное соглашение... Jupiter Свободное общение 18 03.05.2009 10:39
использование функций в качестве параметров других функций mono Помощь студентам 0 20.04.2009 18:25