[Assembly]汇编编写简易键盘记录器
2024-10-17 01:01:29
环境:
Windows xp sp3
工具:
masm
notepad++
首先列出本次编程程序要执行的步骤:
(1)、读取键盘所输入的字符
(2)、输出到屏幕上
(3)、完善Esc、Backspace、空格、回车的输出
首先解决(1)
这里我们可以利用int 16h的中断功能读取字符缓存区的字符
mov ah,
int 16h
执行完int 16h后 ah=扫描码 al=ASCII码
例如我们输入abc后
字符缓存区如下状态
然后执行int 16h
缓存区状态如下
前面的1E61被读进了ah和al
解决(2)
既然解决了(1),也成功读取了ASCII码到al中
这时候就是输出字符到屏幕上了
这里可以用内存中的b800H~bffffH这段32KB的空间输出
B800:0000就对应屏幕上第一列第一行了
mov ax,0b800h
mov es,ax
mov ah,
mov al,
mov es:[si],ax
add si,
高位存放该字符的属性 这里ah=2代码字符以绿色输出
地位存放该字符的ASCII码 这里选择41H(A)来测试
可以明显看到左上角屏幕出现了A
最后可以编写出大概的程序如下;
assume cs:code
code segment
start:
mov cx,2h
mov si,
ints:
mov ah,
int 16h
mov bl,al
mov ax,0b800h
mov es,ax
mov al,bl
mov ah,
mov es:[si],ax
add si,
add cx,
loop ints
mov ax,4c00h
int 21h code ends
end start
执行完int16h之后就不断的往屏幕上输出,然后si+2指向下一个字符输出的屏幕地址
随便输入几个字符,可以成功在屏幕上输出
接下来优化下Esc、Backspace、空格、回车的输出
根据上面的编程,已经知道程序是根据ASCII码到屏幕上输出的,可是Esc、Backspace、空格、回车的ASCII码不太明显
这里用cmp指令判断Esc、Backspace、空格、回车的扫描码,然后再修改对应的al中的ASCII码
程序如下
assume cs:code
code segment
start:
mov cx,2h
mov si,
ints:
mov ah,
int 16h
cmp ah,1ch
je ent
cmp ah,39h
je kg
fh:mov bl,al
mov ax,0b800h
mov es,ax
mov al,bl
mov ah,
mov es:[si],ax
add si,
add cx,
loop ints
mov ax,4c00h
int 21h ent:
mov al,19h
jmp fh
kg:
mov al,07h
jmp fh code ends
end start
编译后我们依次输入Esc、空格、回车、Backspace
可以看到屏幕出现了←(Esc)•(空格)↓(回车)◘(Backspace)
最后附上各个键盘的扫描码
注意,,程序中用了死循环!
最新文章
- style
- 一个简单的CORBA例子
- MyBatis知多少(22)MyBatis删除操作
- Spark Core源代码分析: Spark任务运行模型
- pycharm常用快捷键与设置
- word 2010中如何创建多级目录和多级列表
- UML04-顺序图
- 我看PS求职简历照
- Gentoo网络管理方法总结
- 【git】TurtoiseGit使用手册
- hdu_5858_Hard problem(数学题)
- C++小技巧之CONTAINING_RECORD
- Switch控件详解
- 数据库【mysql】之pymysql
- Outlook插件开发(非VSTO),欢迎交流
- [Linux] Extend space of root disk in Linux7
- LeetCode算法题-Power Of Three(Java实现-七种解法)
- NDVI等植被相关指数
- 使用百度地图实现详细地址自动补全(补全bug''事件只能绑定到一个上的问题')
- Asp.net Core 打包发布 (Linux+Nginx)