第一节 跳过数据区
jmp near start
;跳过下面的数据区
mytext db 'L', 0x07, 'a', 0x07, 'b', 0x07, 'e', 0x07, '1', 0x07, ' ', 0x07, 'o', 0x07, \ 'f', 0x07, 'f', 0x07, 's', 0x07, 'e', 0x07, 't', 0x07, 0x07, ':', 0x07
;标号:mytext,通过db指令预先存储指令的开头字符,从而使数据和指令分离
number db 0, 0, 0, 0, 0
start:
mov ax, 0x07c0
... ...
\
作用:连接字符串
jmp near start
:使处理器跳转到指定的标号位置处执行程序
- 第一条指令执行完成后,处理器会跳转到
start
位置处执行start
位置处的指令
number db 0, 0, 0, 0, 0
:预留内存,以备将来用于存储除法运算所得到的余数(标号十进制各个数位上的值)
start
:标号,可单独占一行,由于start
后没有指令,所以也就不存在汇编地址,故start
的值等于紧挨着的下一行指令的汇编地址,处理器执行改行指令,效果与start: mov ax, 0x07c0
相同
第二节 初始化段地址
- 程序被加载到段地址为
0000
,偏移地址为7c00
的位置处,由于程序不是从段开始的位置处加载的,所以在访问程序中内存单元的时候需要用7c00
到0000
之间的部分加上内存单元在程序中的偏移地址(汇编地址)得到内存单元在段内的偏移地址7c00+汇编地址
- 段地址
0000
与程序加载的起始位置7c00
会形成一个距离差,故每次访问内存单元的时候需要给内存单元中的汇编地址加上一个偏移地址
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-htQ5rEhu-1578108359820)(E:\workspace\TyporaProjects\C笔记\汇编\images\第四章 相同功能更少指令\2-1.png)]](https://i-blog.csdnimg.cn/blog_migrate/3e311401830c8e4dcb24639acc775cbd.png)
- 程序开始加载时的内存地址为
07c00
,对于内存地址来说,可以拥有多个逻辑地址( 0000:7c00
和 07c00:0000
),内存地址是由段地址加偏移地址所组成,故内存地址的段地址可以看作0000
或07c0
,偏移地址则可以看作7c00
或0000
- 第一种情况:
0000:7c00
- 段地址(
0000
)左移4位,得到一个20位的段地址(00000
),加上偏移地址(7c00
),结果仍为7c00
- 第二种情况:
07c0:0000
- 段地址(
07c0
)左移4位,得到一个20位的段地址(07c00
),加上偏移地址(0000
),结果仍为7c00
- 两种情况效果相同,指向同一位置
7c00
,但第二种情况较第一种情况简单,在第二种情况中,将数据段寄存器DS
中的值设置为07c0
,也就是说段的开始位置是7c00
,程序开始加载的位置是0000
,处于同一行,换句话说,程序是从段开始的位置加载的,不需要再加偏移地址
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xZsk5pLu-1578108359822)(E:\workspace\TyporaProjects\C笔记\汇编\images\第四章 相同功能更少指令\2-2.png)]](https://i-blog.csdnimg.cn/blog_migrate/b5d62b0753902355b663d313395bd331.png)
- 内存地址可以有多个逻辑地址,只要段地址左移四位以后加上偏移地址能够指向目标地址即可
mov ax, 0x07c0
mov ds, ax
;将07c0存储到数据段寄存器DS中,作为程序的段地址(此时未对程序进行分段,不能作为数据段的段地址)
;此处两行代码的目的是为后续访问的程序中的内存单元做准备
mov ax, 0xb800
mov es, ax
;将b800存储到附加段寄存器ES中,b800为显存的段地址
;此处两行代码的目的是为后续访问显存中的内存单元做准备
第三节 Movsb
和Movsw
Movsb
(byte)和Movsw
(word)
- 作用:数据的批量传送
- 使用规则:
- 所要传送的数据:
DS:SI
- 传送数据的位置由数据段寄存器
DS
和源变址寄存器SI
指定,数据的段地址存储在DS
寄存器中,偏移地址存储在SI
寄存器中
- 所要传送的位置:
ES:DI