汇编 第4,5,6,7章
第4章
一个源程序从写出到执行的过程:
1,。编译汇编源程序(产生一个存储源程序的文本文件)
2.对源程序进行编译连接(生成可执行文件 包括程序和数据以及相关的描述信息)
3.执行
二。汇编源程序框架:
assume cs:codesg
codesg segment
mov ax,0123H
mov bx,0456H
...
...
mov ax,4c00H
int 21H
codesg ends
end
segment和ends是一对成对使用的伪指令,用来定义段
段名 segment
..
段名 ends
end是汇编程序结束标记
assume含义是假设,假设某一段寄存器和程序的某一个用segment和ends定义的段相关联
在编译连接时可以加上分号,自动忽略中间文件的生成,简化过程。
在DOS中,command处理各种输入:命令或要执行的程序的文件名。我们就是通过command来进行工作的。
在DOS中直接执行.exe时,是正在运行的command,将.exe文件中的程序加载入内存。
command设置CPU的CS:IP指向程序的第一条指令(程序入口),从而程序得以运行。
程序运行结束后,返回到command中,CPU继续运行command
第5章
【bx】和loop指令
要完整地描述一个内存单元,需要两种信息:1,内存单元地址 2.内存单元长度(类型)
【bx】表示一个内存单元,段地址在ds中
loop指令用于循环
标号:标号代表一个地址
Debug和汇编编译器masm对指令的不同处理
Debug:mov ax,[0] 在汇编源程序中会被当做mov ax,0处理
要实现预期效果 借助bx,将偏移地址送入bx寄存器中,用【bx】的方式来访问内存单元
如:
mov ax,2000H
mov ds,ax
mov bx,0
mov al,[bx]
如果想像在Debug中那样直接写,需要显式声明段地址所在的寄存器
mov al,ds:[0]
如果在“[]”里用寄存器,间接段地址默认在ds中
loop和【bx】联合实例
assume cs:code
code segment
mov ax,0fffh
mov ds,ax
mov bx,0
mov cx,12
s: mov al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
段前缀:出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的"ds:' "cs:" "ss:" "es:
DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码,尽量使用这段空间
第六章:包含多个段的程序
使用不同的段 数据段 栈段
数据段中 dw(define word)用于定义字数据 db定义字节
end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方end start
具体用法如下:
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c1 segment db 8 dup(0) c1 ends code segment start: mov ax,a mov ds,ax mov bx,0 mov ax, c1 mov es,ax mov cx,8 s: mov ax,[bx] mov es:[bx],ax add bx,1 loop s mov ax,b mov ds,ax mov bx,0 mov ax,c1 mov es,ax mov cx,8 s2: mov al,[bx] mov ah,0 add es:[bx],ax add bx,1 loop s2 mov ax,4c00h int 21h code ends end start
第七章
更灵活的定位内存地址的方法
两个指令 or and
大小写字母转换:
转化成大写:置0
and 11011111b
转换成小写:置1
or 00100000b
大写+20H=小写
大写+32=小写
SI和DI
是8086CPU中与bx功能相近的寄存器,不能分成两个8位寄存器来使用
利用bx,si,di可以实现更灵活的内存处理方式,类似数组
如下:
题目:编程,将datasg段中每个单词的前4个字母改为大写字母。
代码如下:
assume cs:codesg,ss:stacksg,ds:datasg stacksg segment dw 0,0,0,0,0,0,0,0 stacksg ends datasg segment db '1. display ' db '2. brows ' db '3. replace ' db '4. modify ' datasg ends codesg segment start: mov ax,stacksg mov ss,ax mov sp,16 mov ax,datasg mov ds,ax mov bx,0 mov cx,4 s0: push cx mov cx,4 mov si,3 s: mov al,[bx+si] and al,11011111b mov [bx+si],al inc si loop s add bx,16 pop cx loop s0 mov ax,4c00h int 21h codesg ends end start