本系列文章参考汇编语言第四版和汇编语言程序设计 贺利坚主讲整理而成
程序段前缀是Dos下可执行程序载入内存后结构的一部分,位于前0100h部分,它的大致作用有:
(1) 子进程通过程序段前缀继承、恢复父进程的信息
(2 ) 使子进程正确地返回到父进程
( 3) 恢复中断23 H 和24H 的入口地址
(4) 给子进程提供Dos 的入口信息
大写字母第六位一定为0,小写字母第六位一定为1,因此要将大写字母变成小写,只需要将第六位变为0即可,小写转大写,第六位给一即可
如果将bx作为数组的首地址的话,那么idata可以看做是相对于数组首地址的偏移地址,因为数组中每个元素的大小是一样的,假设都占四个字节,那么idata初始值为0,后面依次累加4即可访问数组下一个元素
因为两个需要处理的字符串每个字符都相隔5个字节的距离,因此可以同时进行处理,利用上面讲到的[bx+5]即可。
bx是基址寄存器,si和di是变址寄存器
Inc si即si+1,每次移动一个字节,但是取出来放入ax中的是一个字的大小
注意-->字的读取顺序:
先读高地址,再读低地址
解释一下:
s: mov al,[bx+3]
and al,11011111b
mov [bx+3],al
add bx,16
loop s
因为每行固定为16个字节,因此要处理下一行数据时,只需要bx+16即可
某段内存到底是被当做数据还是指令,完全由我们自己决定
上面是寄存器相对寻址,标注错了
上面是寄存器相对寻址,标注错了
每个寄存器的使用都有不同和相同之处,这取决于底层硬件具体是如何设置的,因此每个寄存器我们不能乱用,因为硬件层面决定两个寄存器能否互通数据
每个寄存器的使用都有不同和相同之处,这取决于底层硬件具体是如何设置的,因此每个寄存器我们不能乱用,因为硬件层面决定两个寄存器能否互通数据
这里需要注意下面几点:
寄存器是CPU中的珍贵资源,能不占用就不占用,因此我们可以将除数直接从内存中获取,然后直接进行除法运算,而不经过寄存器
assume cs:code, ds:data
data segment
db 3 dup(0)
db 3 dup(0,1,2)
db 80 dup(0)
db 3 dup('abc','ABC')
data ends
code segment
mov ax,data
mov ds,ax
mov ax,4c00H
int 21H
code ends
end
程序加载进内存,此时DS=075A,需要跳过100h的程序段前缀,因此我们从076a看起
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://cjdhy.blog.csdn.net/article/details/125352552
内容来源于网络,如有侵权,请联系作者删除!