Ну да! Я так и говорил когда-то: "Набахкал", главное, чтобы работало, а там смотришь, - что нужно оптимизировать, чтобы "ко дну не тянуло", а то, что неактуально, - вообще не трогать!... и такое хоть на асме хоть, на самом чёрте.Pathoswithin wrote:Наоборот, общая архитектура гораздо важнее чем низкоуровневая оптимизация.
Вот ты, Pathoswithin и CleverMouse говорили мне, что в процедуру должна быть передача через стэк, и возврат тоже. Вот посмотри эту процедуру....
Spoiler:
Code: Select all
; запускасть ScanCodeKey
;Результат обработки в
ScanCodeKey1 rd 1 ; "Чистый" код
ScanCodeKey2 rd 1 ; обработаный код (-128 если больше 128)
ScanCodeKeyUD rd 1 ; если 0 - отжата, если 1 -нажата
ScanCodeKeyExt rd 1 ; 0- обычный код; 1 - доп ext (224); 2 - доп2 ext2 (225)
ScanCodeKeyUnitedCode rd 1 ; "единый" код
ScanCodeKey_int40_2dop:
mov eax,2
mcall
shr eax,8 ; scancode
and eax,0xff
ret
ScanCodeKey: ; START ScanCode
call ScanCodeKey_int40_2dop
cmp eax,224 ; если доп код....
jne ScanCode_cmp_225; если не равно нулю
mov [ScanCodeKeyExt],1
mov [ScanCodeKey1],0
JMP ScanCode_m2;ScanCode_m2
ScanCode_cmp_225:
cmp eax,225 ; если доп2 код....
jne ScanCode_m1; если не равно нулю
mov [ScanCodeKeyExt],2
mov [ScanCodeKey1],0
jmp ScanCode_m2
ScanCode_m1:
; САМА кодировка
ScanCode_m2:
mov[ScanCodeKey1], eax ; "Чистый" код
; Клавиша нажата DOWN
mov[ScanCodeKeyUD],1 ; если 0 - отжата, если 1 -нажата
cmp eax,128
jb no_up
; Клавиша отжата секция UP
mov[ScanCodeKeyUD],0 ; если 0 - отжата, если 1 -нажата
no_up:
mov ebx,eax
and ebx,0x7f
mov [ScanCodeKey2],ebx ; обработаный код (-128 если больше 128)
; "единый" код
mov eax,[ScanCodeKeyExt]
shl eax,8
add eax,ebx
mov[ScanCodeKeyUnitedCode],eax
ScanCodeKey_ret: ret
ScanCodeKey1 ,ScanCodeKey2, ScanCodeKeyUD, ScanCodeKeyExt, ScanCodeKeyUnitedCode ,
а не в регистрах и стэке ?!
А далее, процедура которая вызывает ScanCodeKey
Spoiler:
Code: Select all
KeyProcess2:
call ScanCodeKey
mov eax,[ScanCodeKey2]
mov [readmask_keynum],eax
call readmask2
cmp [readmask_Result],0
jz KeyProcess2_ret ; если нет клавиши в таблице
mov eax,[readmask_Result]
mov [kbd_mask],eax
mov eax, [ScanCodeKeyUD]; если 0 - отжата, если 1 -нажата
mov [kbd_press],eax
call kbdA
mov [ScanCodeKeyExt],0
KeyProcess2_ret:
ret
В быстродействии через стек ? В меньшем коде ? А ведь Push, Pop тоже ведь занимают место в памяти(!), да и по тактам они ведь не "нулевые"(!), а [SP+$04], ведь тоже самое, что обращение, что mov eax,[readmask_Result], например ?... ничем не быстрее, ведь правильно я говорю?!... а сколько примудростей (подготовки Push`ами), надо чтобы доступатся вот так вот [SP+$04], а потом, Pop`ами это всё "утрясать", да нигде и не в чём не ошибится.
А у меня всё просто: в одной процедуре получает переменная значение вот так mov [ScanCodeKey2],ebx), в другой использует его вот так mov eax,[ScanCodeKey2].
ВСЁ! Чего еще надо?!... особенно новичку!
Не любите вы новичков, ох, не любите!
Вместо того, чтобы мне вот такое объяснить, (это я бы так новичку объяснял, тому кто новее меня....) вы мне про какие-то стандарты передачи, в процедуру... из процедуры
видимо вообще мне захотели мозги "зашить" напрочь!
Не, ну, Pathoswithin и CleverMouse не поймите меня неправильно!... я опредёленно вам благодарен за многое! Но спор есть спор! Спор требует фактов! В споре рождается истина! Поэтому не сочтите эти строки за оскорбление или неуважение!