Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверьте, пожалуйста ввод 
:(
    Опции темы
ТарасАтавин
Дата 17.9.2013, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Код
     MOV RAX, 0x0000000000000000
     MOV Result, RAX
     MOV RCX, 0xFFFFFFFFFFFFFFF6
     PUSH RCX
     CALL GetStdHandle
     POP RCX
     MOV RCX, RAX
     MOV RDX, &Count
     PUSH RCX
     PUSH RDX
L01: CALL GetNumberOfConsoleInputEvents
     POP RDX
     POP RCX
     MOV R10, Count
     CMP R10, 0
     JE L01
L02: CMP R10, 0
     JE
     MOV RDX, $Bufer
     MOV R8, 0x0000000000000001
     MOV R9, $Readed
     PUSH RCX
     PUSH RDX
     PUSH R8
     PUSH R9
     CALL ReadConsoleInput
     POP R9
     POP 98
     POP RDX
     POP RCX
     DEC R10
     MOV R11, EventType
     CMP R10, 0x0000000000000001
     JNE L02
     MOV EBX, bKeyDown
     CMP EBX, 0x00000000
     JE L02
     MOV BX, wRepeatCount
L03: CMP BX, 0x0000
     JE L02
     MOV BL, AsciiChar
     CMP BL, '0'
     JE L04
     CMP BL, '1'
     JE L05
     CMP BL, '2'
     JE L06
     CMP BL, '3'
     JE L07
     CMP BL, '4'
     JE L08
     CMP BL, '5'
     JE L09
     CMP BL, '6'
     JE L10
     CMP BL, '7'
     JE L11
     CMP BL, '8'
     JE L12
     CMP BL, '9'
     JE 13
     MOV RAX, 0x0000000000000000
     RET
L04: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     JMP L14
L05: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000001
     JMP L14
L06: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000002
     JMP L14
L07: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000003
     JMP L14
L08: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000004
     JMP L14
L09: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000005
     JMP L14
L10: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000006
     JMP L14
L11: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000007
     JMP L14
L12: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000008
     JMP L14
L13: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000009
L14: MOV Result, RAX
     DEC BX
     JMP L03



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
DarthTon
Дата 17.9.2013, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: нет
Всего: 6



В х64 аргументы вызываемых функций не надо пихать на стек после их размещения в регистрах.
Т.е вызовы вида
Код

     MOV RDX, $Bufer
     MOV R8, 0x0000000000000001
     MOV R9, $Readed
     PUSH RCX
     PUSH RDX
     PUSH R8
     PUSH R9
     CALL ReadConsoleInput
     POP R9
     POP R8

следует заменить на 
Код

     MOV RDX, $Bufer
     MOV R8, 0x0000000000000001
     MOV R9, $Readed
     CALL ReadConsoleInput


Ну и не следует забывать что перед вызовом апи функций стек должен быть выровнен на границу 16 байт, а так же иметь минимум 32 байта свободного пространства для сохранения значения регистров.
PM MAIL   Вверх
ТарасАтавин
Дата 17.9.2013, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(DarthTon @  17.9.2013,  11:21 Найти цитируемый пост)
В х64 аргументы вызываемых функций не надо пихать на стек после их размещения в регистрах.
 Вроде ж написано, что они размещаются в регистрах RCX-R9, но место под них в стеке всё равно резервируется. Вот я так и резервировал.

Добавлено @ 11:56
Цитата(DarthTon @  17.9.2013,  11:21 Найти цитируемый пост)
Ну и не следует забывать что перед вызовом апи функций стек должен быть выровнен на границу 16 байт, а так же иметь минимум 32 байта свободного пространства для сохранения значения регистров. 
А разе у меня он не выровнен? Вот только про 32 байта я не понял. Как это реализовать?

Добавлено @ 11:58
Цитата(DarthTon @  17.9.2013,  11:21 Найти цитируемый пост)
Т.е вызовы вида
код Ассемблера
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
     MOV RDX, $Bufer
     MOV R8, 0x0000000000000001
     MOV R9, $Readed
     PUSH RCX
     PUSH RDX
     PUSH R8
     PUSH R9
     CALL ReadConsoleInput
     POP R9
     POP R8

следует заменить на 
код Ассемблера
1:
2:
3:
4:
     MOV RDX, $Bufer
     MOV R8, 0x0000000000000001
     MOV R9, $Readed
     CALL ReadConsoleInput
А как есть работать будет? Не оптимальности пока пропускаем, интересуют ошибки. А то если я сейчас возщьмусь за тест, то не пойму, что именно меня не фурычит: ввод, вывод, или формат PE. Когда будет хоть какой то правильный ввод, хоть какой то правильный вывод, и хоть какая то правильная сборка файла, дальше у же попробую сам. Это всего лишь четвёртая моя проба клавы на асме, причём, первые две были для Z80. Они то работали, да камушек слишком другой. А на AMD64 я ничего своего, на асме писанного, не запускал.

Добавлено @ 12:06
Например, с умножением я не накосяил? Вводить предполагается uint64_t.

Это сообщение отредактировал(а) ТарасАтавин - 17.9.2013, 12:07


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
DarthTon
Дата 17.9.2013, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: нет
Всего: 6



Работать будет в принципе и так, просто обычно так код не пишут/генерят под х64. Насчет резервирования места на стеке - обычно компилятор анализирует функцию на предмет вызова из неё других функций, и в прологе резервирует место под наибольшее возможное количество аргументов вызываемой функции, а в эпилоге освобождает. Т.е если, например, вызывается 3 функции, которые принимают 3, 7 и 4 параметра, то в прологе будет sub rsp, 64. Это делается потому что в х64 не используется push/pop и стековый кадр для передачи параметров в функции, только прямая запись через указатель rsp. 
По поводу выравнивания - по-умолчанию, конечно, всё выровнено, просто надо об этом помнить если происходят ручные манипуляции с rsp, чтобы избежать возможных падений в рантайме из-за этого.
С умножением вроде всё нормально - разрядность операции определяется первым аргументом imul, а он 64 битный.
PM MAIL   Вверх
ТарасАтавин
Дата 18.9.2013, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Про определение разрядности операции я в курсе. А куда помещается результат IMUL при такой разрядности? И В переходах я не не напутал? Кажется я забыл вернуть значение при успешном завершении и забыл один счётчик. 
Код
     MOV RAX, 0x0000000000000000
     MOV Result, RAX
     MOV RCX, 0xFFFFFFFFFFFFFFF6
     CALL GetStdHandle
     CMP EAX, 0x00000000
     JE l16
     MOV RCX, RAX
     MOV RDX, &Count
L01: CALL GetNumberOfConsoleInputEvents
     CMP EAX, 0x00000000
     JE L16
     MOV R10, Count
     CMP R10, 0x0000000000000000
     JE L01
L02: CMP R10, 0x0000000000000000
     JE L17
     MOV RDX, $Bufer
     MOV R8, 0x0000000000000001
     MOV R9, $Readed
     CALL ReadConsoleInput
     CMP EAX, 0x00000000
     JE L16
     DEC R10
     MOV R11, EventType
     CMP R10, 0x0000000000000001
     JNE L02
     MOV EBX, bKeyDown
     CMP EBX, 0x00000000
     JE L02
     MOV BX, wRepeatCount
L04: CMP BX, 0x0000
     JNE L03
     DEC R10
     JMP L02
     MOV BL, AsciiChar
     CMP BL, '0'
     JE L05
     CMP BL, '1'
     JE L06
     CMP BL, '2'
     JE L07
     CMP BL, '3'
     JE L08
     CMP BL, '4'
     JE L09
     CMP BL, '5'
     JE L10
     CMP BL, '6'
     JE L11
     CMP BL, '7'
     JE L12
     CMP BL, '8'
     JE L13
     CMP BL, '9'
     JE L14
     JMP L16
L05: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     JMP L15
L06: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000001
     JMP L15
L07: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000002
     JMP L15
L08: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000003
     JMP L15
L09: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000004
     JMP L15
L10: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000005
     JMP L15
L11: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000006
     JMP L15
L12: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000007
     JMP L15
L13: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000008
     JMP L15
L14: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000009
L15: MOV Result, RAX
     DEC BX
     JMP L04
L16: MOV RAX, 0x0000000000000000
L17: RET


Это сообщение отредактировал(а) ТарасАтавин - 18.9.2013, 07:47


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bems
Дата 18.9.2013, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



GetStdHandle не обязана возвращать консоль

Добавлено через 5 минут и 8 секунд
нет проверки на INVALID_HANDLE_VALUE

тип HANDLE на х64 занимает все 64 бита, а возвращаемое значение берется как EAX (32 бита)



--------------------
Обижено школьников: 8
PM MAIL   Вверх
ТарасАтавин
Дата 18.9.2013, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(bems @  18.9.2013,  17:06 Найти цитируемый пост)
тип HANDLE на х64 занимает все 64 бита, а возвращаемое значение берется как EAX (32 бита)
Перепутал функции. Думал, что в RAX BOOL возвращается, у него по таблице одна разрядность на Win x32 и Win x64. HANDLE возвращается по параметру-указателю. Исправил. А INVALID_HANDLE_VALUE равен NULL, или чему то другому?

Добавлено через 11 минут и 12 секунд
Код
     MOV RAX, 0x0000000000000000
     MOV Result, RAX
     MOV RCX, 0xFFFFFFFFFFFFFFF6
     CALL GetStdHandle
     CMP RAX, INVALID_HANDLE_VALUE
     JE L16
     MOV RCX, RAX
     MOV RDX, &Count
L01: CALL GetNumberOfConsoleInputEvents
     CMP EAX, 0x00000000
     JE L16
     MOV R10, Count
     CMP R10, 0x0000000000000000
     JE L01
L02: CMP R10, 0x0000000000000000
     JE L17
     MOV RDX, $Bufer
     MOV R8, 0x0000000000000001
     MOV R9, $Readed
     CALL ReadConsoleInput
     CMP EAX, 0x00000000
     JE L16
     DEC R10
     MOV R11, EventType
     CMP R10, 0x0000000000000001
     JNE L02
     MOV EBX, bKeyDown
     CMP EBX, 0x00000000
     JE L02
     MOV BX, wRepeatCount
L04: CMP BX, 0x0000
     JNE L03
     DEC R10
     JMP L02
     MOV BL, AsciiChar
     CMP BL, '0'
     JE L05
     CMP BL, '1'
     JE L06
     CMP BL, '2'
     JE L07
     CMP BL, '3'
     JE L08
     CMP BL, '4'
     JE L09
     CMP BL, '5'
     JE L10
     CMP BL, '6'
     JE L11
     CMP BL, '7'
     JE L12
     CMP BL, '8'
     JE L13
     CMP BL, '9'
     JE L14
     JMP L16
L05: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     JMP L15
L06: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000001
     JMP L15
L07: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000002
     JMP L15
L08: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000003
     JMP L15
L09: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000004
     JMP L15
L10: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000005
     JMP L15
L11: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000006
     JMP L15
L12: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000007
     JMP L15
L13: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000008
     JMP L15
L14: MOV RAX, Result
     IMUL RAX, 0x000000000000000A
     ADD RAX, 0x0000000000000009
L15: MOV Result, RAX
     DEC BX
     JMP L04
L16: MOV RAX, 0x0000000000000000
L17: RET


Это сообщение отредактировал(а) ТарасАтавин - 18.9.2013, 20:06


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bems
Дата 18.9.2013, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(ТарасАтавин @  18.9.2013,  19:55 Найти цитируемый пост)
А INVALID_HANDLE_VALUE равен NULL, или чему то другому?

чему-то другому
(HANDLE)(-1) вроде бы


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.1298 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.