Assembly-5
汇编语言学习笔记-5
0x00 直接定址表
如何有效合理的组织数据,以及相关编程。
地址标号:在后面加
:
,只能在代码段中使用,不能在其他段中使用。数据标号:后面没有
:
,表示内存单元的地址与内存单元的长度。
下面给出两个标号的例子,都是将a段中每个数据相加,并放到b中。
- 地址标号的程序如下:
- 数据标号的程序如下:
可以看到,数据标号的程序更类似于C语言中数组的用法,而数据标号看上去更简洁。
Q&A
1 | s: |
数据标号可以用到其他段中(但是要将所在段与段寄存器联系起来,否则编译器在编译时无法确定标号的段地址在哪一个寄存器中),数据标号可以描述存储数据的单元的地址和长度。
也可以将标号当作数据来定义,如下所示:
注:offset a
指的是取a的偏移地址,seg a
指的是取a的段地址。
Q&A
1 | start: |
分析:byte型数据为1F(8位),那么在屏幕中间就输出字符串”1F”。字符转换关系如下:
可以看到,转换关系不一致,如何实现这种转换,就要用查找表(可以在两个集合之间建立映射关系)。
1 | assume cs:code, ds:data |
Q&A
1 | assume cs:code, ds:data, ss:stack |
上述程序是有问题的。上述程序想要实现的是:输入一个字符串,字符串是一个角度,然后输出角度对应的sin值。如果用in al, 60H
,同一时间,60H端口只保留一个值,如果没有及时取出这个值,那么就会被之后输入的字符所覆盖,那我们就要与empty_cycle
结合,且等时间间隔输入字符。因此,几乎不可能使用in al, 60H
进行字符串输入。
注:第(4)条这应该是向下滚动。
1 | assume cs:code |
0x01 使用BIOS进行键盘输入和磁盘读写
之前说过,BIOS提供9号中断,当键盘发生输入时,会引起9号中断。CPU在9号中断发生后,执行int 9
中断例程,此中断例程会从60h端口读出扫描码,并转为相应的ASCII码,并存储在内存的指定空间(键盘缓冲区,可存储16个字,可以存储15个按键的ASCII码与扫描码)中。
对于程序员而言,BIOS提供了int 16h
中断例程。int 16h
中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0。使用说明:
1 | mov ah,0 |
int 16h
的0号功能具体进行下列操作:
(1)检测键盘缓冲区中是否有数据;
(2)没有则继续做第1 步;
(3)读取缓冲区第一个字单元中的键盘输入;
(4)将读取的扫描码送入ah,ASCII 码送入al;
(5)将己读取的键盘输入从缓冲区中删除。
可见,BIOS 的int 9
中断例程和int 16h
中断例程是一对相互配合的程序,int 9
中断例程向键盘缓冲区中写入,int 16h
中断例程从缓冲区中读出。它们写入和读出的时机不同,int 9
中断例程(使用了in al, 60H
)在有键按下的时候向键盘缓冲区中写入数据,而int 16h
中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出。
Q&A
1 | assume cs:code |
0x02 键盘字符串输入
1 | assume cs:code, ds:data |
留言
- 文章链接: https://wd-2711.tech/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!