Дмитрий
Дмитрий
например вот
написал мультипротокольый diseq для тарелки
Дмитрий
1.0 1.1 и 1.2
Дмитрий
на радиолоцмане есть моя статья на асме
https://www.rlocman.ru/shem/schematics.html?di=207985
КТ315
под 16 пик в мплабе + нсс 9.7
Да на PIC тоже самое будет примерно. Я вот на PIC не писал, открыл список инструкций по документации, и сразу вижу инструкции для AND, OR, и для работы с памятью:
Запись нового бита:
movlw NEW_NOT_BIT_VALUE and 1
movwf BIT
call GetSomeNotBit ; Может вернуть сразу в BIT, на если в W:
andlw 1
mowf BIT
Чтение:
movf BIT, W
Условие:
btfss BIT
goto bit_set
5 минут делов разобраться...
Крутой
Есть резидентная программа под DOS 6.22, которая на событие нажатия клавиши должна выделять всю доступную XMS память в системе (про расширенную память можно почитать вот здесь: https://frolov-lib.ru/books/bsp.old/v33/ch11.htm)
Программа идеально отрабатывает в DOS-BOX, в виртуалке из под VirtualBox, но вот под Qemu желаемого результата не наблюдается.
После запуска программы можно спокойно работать с клавиатурой, но после нажатия клавиши 'ScrollLock' происходит зависание системы и высвечивается непонятный символ в верхнем правом углу.
С чем это может быть связано, помогите пожалуйста.
.model tiny
.code
ORG 100h
main:
;Переходим на метку инициализации. Нам нужно будет перехватить прерывание 09h,
;а также оставить программу резидентной в памяти
jmp Init
;Ниже идет, собственно, код обработчика прерывания 09h(он будет резидентным).
;После того как программа выйдет, процедура New_09h останется в памяти
New_09h proc
cli
push ax ;Сохранить регистры в стек
push dx
push ds
push es
mov ax,cs
mov ds,ax
in al,60H ;читать ключ
cmp al,46h ;Если нажата клавиша 'ScrollLock'
je do_pop ;да, активизировать popup
pop es ;восстанавливаем регистры
pop ds
pop dx
pop ax ;и уходим на исходный обработчик
jmp dword ptr cs:[Old_09h] ;на метку do_pop программа уже не вернется
;код отработки нажатия клавиши 'ScrollLock'
do_pop:
;получаем адрес управляющей функции драйвера
mov ax,4310h
int 2fH
mov word ptr cs:[HMMEntry][0],bx
mov word ptr cs:[HMMEntry][2],es
;определяем размер свободной расширенной памяти (на выходе
;DX - общий размер свободной расширенной памяти, Кбайт)
mov ax,0800h
call cs:[HMMEntry]
;выделяем всю доступную память (DX уже содержит
;размер требумого блока, Кб)
mov ah,09h
call cs:[HMMEntry]
in al,61H ;взять значениe порта управления клавиатурой
mov ah,al ;сохранить его
or al,80h ;установить бит разрешения для клавиатуры
out 61H,al ;и вывести его в управляющий порт
xchg ah,al ;извлечь исходное значение порта
out 61H,al ;и записать его обратно
mov al,20H ;послать сигнал "конец прерывания"
out 20H,al ;контроллеру прерываний 8259
pop es ;восстанавливаем регистры
pop ds
pop dx
pop ax
iret ;возврат из обработчика прерываний
New_09h endp
HMMEntry DD ?
Old_09h dd ? ;определение ячейки памяти для хранения адреса системного обработчика
;Со следующей метки нашей программы уже не будет в памяти (это нерезидентная
;часть).Она затрется сразу после выхода (после вызова прерывания 27h)
Init:
;Установим наш обработчик (New_09h) (адрес нашего обработчика)
;на прерывание 09h. Это позволяет сделать функция 25h прерывания 21h.
;Но прежде нам нужно запомнить оригинальный адрес этого прерывания.
;Для этого используется функция 35h прерывания 21h:
;ah содержит номер функции
mov ah,35h
mov al,09h
int 21h
;Теперь в es:bx адрес (вектор) прерывания 09h (es — сегмент, bx — смещение)
mov word ptr Old_09h,bx
mov word ptr Old_09h+2,es
;запись стартового обработчика в вектор прерываний
mov ax,2509h
mov dx,offset New_09h
int 21h
;выводим сообщение о загрузке резидента в память
mov ah,09h
mov dx,offset InitMsg
int 21h
;возврат в DOS, оставшись резидентным
mov dx,offset Init
int 27h
InitMsg DB "Resident installed in memory!",13,10,"$"
end main
Крутой
Что забавно - эта Лена реально HR-ка с яндекса была...
Alexey
URALBANG
Показалось
Крутой
Ещё раз?
Крутой
А, я думал у меня инет накрылся
Крутой
Всё понятно, помогать никто не хочет)
Крутой
Ну а как описать большую проблему в 2 словах? Тогда не понятно будет ничего
Alexey
Alexey
Крутой
Да какой ГПТ, он ничего сделать не может. Я всё писал. Объединял по примерам из Книг Калашникова, Зубкова, сайта Фролова
Yuri
Привет! Ищу человека, который играл в майнкрафт на частичную занятость
Старший преподаватель Minecraft
https://teletype.in/@zabudko/ap_byBjD_Na
Младший преподаватель Minecraft
https://teletype.in/@zabudko/vcpK6DgXnku
Михаил
The Bird of Hermes
Какой умный бот.
Aiwan \ (•◡•) / _bot
ты на дому принимаешь? че по чем?
Alexey
@FAssembler помоги, библиотека под любым предлогом отказывается работать format PE DLL
entry DllEntryPoint
include 'win32a.inc'
section '.text' code readable writeable executable
proc DllEntryPoint msg, frmt
push dword ptr msg
push dword ptr frmt
call ptr printf
call ptr getch
ret
endp
section '.idata' import readable writeable
library msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf', getch, '_getch'
section '.edata' export data readable
export 'dlltest.dll', DllEntryPoint, 'DllEntryPoint' вот так я ее вызываю в исполняемом format PE CONSOLE
entry start
include 'win32a.inc'
section '.text' code readable writeable executable
start:
push msg
push frmt
call [DllEntryPoint]
section '.data' data readable writeable
msg db 'Hello',0
frmt db '%s',0
section '.idata' import readable writeable
library dll, 'dlltest.dll'
import dll, DllEntryPoint, 'DllEntryPoint'
Alexey
а вот так на меня ругаются
Alexey
что делать то вообще, я уже и без С-функций писал и что только не делал все равно всегда ошибка вылезает
Alexey
я уже в отчаянии такую фигню не реализовать
Aiwan \ (•◡•) / _bot
у тя точка входа не правильная. писали же уже
Aiwan \ (•◡•) / _bot
она параметры от ОС принимает, а не от тебя, и там 3 параметра
Alexey
*d0x65viant;
@FAssembler помоги, библиотека под любым предлогом отказывается работать format PE DLL
entry DllEntryPoint
include 'win32a.inc'
section '.text' code readable writeable executable
proc DllEntryPoint msg, frmt
push dword ptr msg
push dword ptr frmt
call ptr printf
call ptr getch
ret
endp
section '.idata' import readable writeable
library msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf', getch, '_getch'
section '.edata' export data readable
export 'dlltest.dll', DllEntryPoint, 'DllEntryPoint' вот так я ее вызываю в исполняемом format PE CONSOLE
entry start
include 'win32a.inc'
section '.text' code readable writeable executable
start:
push msg
push frmt
call [DllEntryPoint]
section '.data' data readable writeable
msg db 'Hello',0
frmt db '%s',0
section '.idata' import readable writeable
library dll, 'dlltest.dll'
import dll, DllEntryPoint, 'DllEntryPoint'
Я чуть-чуть подправил, и настоятельно рекомендую обзавестись отладчиком и дизассемблером вроде IDA Pro, Ghydra, x64db они помогут тебе понять что на самом деле скомпилировал Fasm, отладить код и найти ошибку, ещё будет плюсом скачать нормальный редактор для Fasm (хотя бы FasmEditor ).
Документация у Fasm хорошая (как и сообщество и форум) как и примеров на Fasm, а редакторы вроде FasmEditor по умолчанию создают заготовки в зависимости от того и для чего ты хочешь написать программу, чтобы не тратить время на мелочи.
format PE console DLL
entry DllEntryPoint
include 'win32a.inc'
section '.text' code readable executable
proc DllEntryPoint hinstDLL, fdwReason, lpvReserved
mov eax, TRUE
ret
endp
proc my_func msg:DWORD, frmt:DWORD
invoke printf, [frmt], [msg]
invoke getchar
endp
section '.idata' import data readable writeable
library msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf', getchar, 'getchar'
section '.edata' export data readable
export 'test.DLL',\
my_func, 'my_func'
section '.reloc' fixups data readable discardable
if $=$$
dd 0,8 ; if there are no fixups, generate dummy entry
end if
format PE CONSOLE
entry start
include 'win32a.inc'
section '.text' code readable writeable executable
start:
invoke my_func, msg, frmt
section '.data' data readable writeable
msg db 'Hello',0
frmt db '%s',0
section '.idata' import readable writeable
library dlltest, 'test.dll'
import dlltest, my_func, 'my_func'
Alexey
Я чуть-чуть подправил, и настоятельно рекомендую обзавестись отладчиком и дизассемблером вроде IDA Pro, Ghydra, x64db они помогут тебе понять что на самом деле скомпилировал Fasm, отладить код и найти ошибку, ещё будет плюсом скачать нормальный редактор для Fasm (хотя бы FasmEditor ).
Документация у Fasm хорошая (как и сообщество и форум) как и примеров на Fasm, а редакторы вроде FasmEditor по умолчанию создают заготовки в зависимости от того и для чего ты хочешь написать программу, чтобы не тратить время на мелочи.
format PE console DLL
entry DllEntryPoint
include 'win32a.inc'
section '.text' code readable executable
proc DllEntryPoint hinstDLL, fdwReason, lpvReserved
mov eax, TRUE
ret
endp
proc my_func msg:DWORD, frmt:DWORD
invoke printf, [frmt], [msg]
invoke getchar
endp
section '.idata' import data readable writeable
library msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf', getchar, 'getchar'
section '.edata' export data readable
export 'test.DLL',\
my_func, 'my_func'
section '.reloc' fixups data readable discardable
if $=$$
dd 0,8 ; if there are no fixups, generate dummy entry
end if
format PE CONSOLE
entry start
include 'win32a.inc'
section '.text' code readable writeable executable
start:
invoke my_func, msg, frmt
section '.data' data readable writeable
msg db 'Hello',0
frmt db '%s',0
section '.idata' import readable writeable
library dlltest, 'test.dll'
import dlltest, my_func, 'my_func'
благодарю, кроме мануала можешь посоветовать книжки?
Alexey
желательно, где больше практики
*d0x65viant;
благодарю, кроме мануала можешь посоветовать книжки?
Ну я начинал вот с этой книги:
https://ir.ozone.ru/s3/multimedia-7/c1000/6400125751.jpg
Если будешь практиковаться по книге, очень рекомендую взять за привычку пользоваться отладчиками и дизассемблерами, это сильно поможет и упростит обучение, сделает более глубоким понимание как вообще работает код, ещё будет полезным ознакомиться с PE форматом, если хочешь писать для Windows.
Alexey
*d0x65viant;
Aiwan \ (•◡•) / _bot
спасибо
так там насм. а как же "фасм лучше всех!!!"?
sans
Alexey
Aiwan \ (•◡•) / _bot
чем лучше?
надо у него спросить. я утрировано. вроде от него часто вижу подобные слова
Alexey
чем лучше?
для меня лучше тем, что fasm легче дается
*d0x65viant;
надо у него спросить. я утрировано. вроде от него часто вижу подобные слова
Ассемблер +- везде одинаковый (если речь об одной и той же архитектуре), просто Fasm более практичный (в том числе из-за макросов) когда речь идёт о разработке кода, а книга больше рассчитана для тех кто только начинает осваивать ассемблер, и пытается понять как он работает/пишет первые программы.
Aiwan \ (•◡•) / _bot
Alexey
Aiwan \ (•◡•) / _bot
там масм
Мда
Опять у кого-то шило в жопе чешется.
sans
кто-то так сильно не любит ассемблер?
Alexey
Аааа нас атакуют
U1TR0N
Блин - весь чат загадили
U1TR0N
Кому-то нечем заняться, когда нормально канал функционирует и пользу несёт
Aiwan \ (•◡•) / _bot
sans
Aiwan \ (•◡•) / _bot
sans
?
в чем прикол рейдить чат по ассемблеру
Alexey
sans
мне реально стало интересно
sans
это же не политический чат
Alexey
Если бы он капчу еще мог пройти…
Рекомендую отключить уведомления на пару часов.
Aiwan \ (•◡•) / _bot
вход запрети до заватра
Баир
Здравствуйте. Подскажите, пожалуйста, по логике. Пользователь вводит числа, в т.ч. отрицательные. Я их сохраняю в массив. Затем мне надо посчитать их сумму. Ступор в том, что не могу понять в каком виде хранить числа. Если конвертировать из ASCII, то как потом понять, что в массиве отрицательное число? Или же хранить их коды и потом при обработке переводить из ASCII и считать?
Aiwan \ (•◡•) / _bot
изучи тему отрицательных чисел в компе/памяти, как они представляются
Aiwan \ (•◡•) / _bot
Баир
read_from_input:
mov eax, 3
mov ebx, 0
lea ecx, [buffer]
mov edx, 4
int 80h
ret
Потом из буфера записываю в массив. Кажется, я нашел как проверять знак числа: test eax, eax например.
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
поищи в чате хештег book
Alexey
???
Alexey
Ответ очевидный
Guldan
Я пишу, да стоит
Replicant
Всем привет, хочу начать учить асм, подскажите под какую архитектуру учить асм x86 или сразу под x64?
86
Replicant
почему? Я слышал, что он уже почти не используется
Учи тогда ARM. Или VLIW
Alexey