软件的基本操作:
mount c d:\masm
C:
dir
启动:debug 退出:q
20位 寄存器16位
1、物理地址 = 段地址*16 + 偏移地址
2、AL =AL +BL 如果溢出不可进位
3、寄存器16位,寻址范围为64KB,所以偏移地址寻址范围最大为64KB
4、段寄存器
CS----代码段 DS---数据段 SS---栈段 ES附加段
5、Debug是什么:
(1)Debug是DOS系统中的著名的调试程序,也可以运行在windows系统实模式下
(2)使用Debug程序,可以查看CPU各种寄存器中的内容、内存的情况,并且在机器指令集跟踪程序的运行
6、Debug能做什么
(1)用R命令查看、改变CPU寄存器的内容 r r ax +回车
(2)用D命令查看内存中的值 d d 2000:0000 d 2000:0 f d 2000:0 2f
(3)用E命令改变内存中的值 e 2000:0000 11 22 33
(4)用U命令将内存中的机器指令翻译成汇编指令 u 2000:0
(5)用A命令以汇编指令的格式在内存中写入机器指令 CS:IP a 073f:0100 +回车+汇编程序 mov ax,bx
(6)用T命令执行机器指令 t 执行CS:IP指向的汇编程序
7、8086PC读取和执行指令:CS代码段寄存器 IP指令指针寄存器
(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP = IP + 所读取指令的长度,从而指向下一条指令;
(3)执行指令。转到步骤(1),重复这个过程。
8、转移指令jmp
(1)同时修改CS,IP的内容
jmp 段地址:偏移地址 jmp 2AE3:3
功能:用指令中给出的段地址修改CS,偏移地址修改IP
(2)仅修改IP的内容
jmp 某一合法寄存器 jmp ax (类似于mov IP,ax)但是这条指令不存在
9、CPU从内存单元中读取数据:DS和[address]配合
(1)用DS寄存器存放要访问的数据的段地址
(2)偏移地址用[...]形式直接给出
mov bx,1000H mov ds,bx mov al,[0] 将10000H(1000:0)中的数据读到al中
mov bx,1000H mov ds,bx mov [0] ,al 将al中的数据写到10000H(1000:0)中
10、套路数据----->一般寄存器------>段寄存器
11、字的传送 8086可以一次性传送16位数据
mov bx,1000H
mov ds,bx
mov ax,[0] ;1000:0处的字型数据送入ax
mov [0],cx ;cx中的16位数据送到1000:0处
12、push入栈:push ax 将ax中的数据入栈 1)SP SP-2; 2)向SS:SP指向的字单元送入数据
pop出栈:pop ax 将栈顶中取出数据给ax (以字为单位对栈进行操作) 1)从SS:SP指向的字单元中读取数据;2)SP=SP-2
SP栈顶指针
SS段寄存器
mov ax,1000H
mov ss,ax
mov sp,0010H
mov ax,001AH
mov bx,001BH
push ax
push bx
pop ax
pop bx
13、用汇编语言编写程序的工作过程:汇编程序---编译器----机器码-----计算机
assume cs:codesg 假设 伪指令:没有对应机器码的指令,最终不被CPU执行
codesg segment 段的开始:段名 +segment
mov ax,0123H 汇编指令,对应有机器码的指令,可以被编译为机器指令,最终被CPU执行
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00h 程序返回(套路!):程序结束后将CPU的控制权交还给使他得以运行的程序
int 21h
codesg ends 段的结束:段名 +ends
end 汇编程序结束标记
谁来执行伪指令?伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关编译工作
14、编译程序:masm xx.asm;或者masm xx;
15、连接 link xx;
16、执行(dos) xx
17、Debug装载程序:debug xx.exe
18、loop指令: loop +标号
(1)(cx)=(cx)-1;
(2)判断cx中的值:不为0则转至标号处执行程序,如果为0则向下执行
assume cs:codesg 假设 伪指令:没有对应机器码的指令,最终不被CPU执行
codesg segment 段的开始:段名 +segment
mov ax,2 汇编指令,对应有机器码的指令,可以被编译为机器指令,最终被CPU执行
mov cx,11
s: add ax,ax
loop s
mov ax,4c00h 程序返回(套路!):程序结束后将CPU的控制权交还给使他得以运行的程序
int 21h
codesg ends 段的结束:段名 +ends
end 汇编程序结束标记
19、段前缀 mov ax,DS:[0] //不这样写debug的时候 mov ax,[0],会把[0]当做 0 赋值给ax
20、在代码段中使用数据
编程计算一下8个数据的和,结果保存在ax中
assume cs:code
code segment
dw 0123H ,0456H ,0789H,0abcH,0defH,0fedH,0cbaH,0987H //dw定义字数据
start:mov bx,0 //CS;IP指向此处 start
mov ax,0
mov cx,8
s:add ax,cs:[bx] //从cs:[0]取出数据0123H
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
21、在代码段中使用栈:倒序存放
assume cs:code
code segment
dw 0123H ,0456H ,0789H,0abcH,0defH,0fedH,0cbaH,0987H //dw定义字数据
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //定义空数据用作栈空间
start:mov ax,cs //CS;IP指向此处 start
mov ss,ax
mov sp,30h
s:push cs:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0:pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
22、数据在不同段
assume cs:code ,ds:data,ss:stack
data segment
dw 0123H ,0456H ,0789H,0abcH,0defH,0fedH,0cbaH,0987H //dw定义字数据
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //定义空数据用作栈空间
stack ends
code segment
start:mov ax,stack //CS;IP指向此处 start
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov bx,0000
mov cx,8
s:push [bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0:pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
23、处理字符问题,将字符转换为ASSII值
解决大小写转换
assume cs:codesg ,ds:datasg
datasg segment
db 'BaSiC'
db 'iNfOrMaTiOn'
datasg ends
code segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111b
mov [bx],al
inc bx
loop s
s0:mov al,[bx]
or al,00100000b
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
code ends
end start
24、[bx + idata]的含义
mov ax,[bx+200] 偏移地址为200加上bx中的数值
mov ax,200[bx]
mov ax,[bx].200
assume cs:codesg ,ds:datasg
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
code segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111b
mov [bx],al
mov al,[5+bx]
or al,00100000b
mov [5+bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
25、变址寄存器 SI (source index) DI (destindex) 16位寄存器不可分高低位 bx常用作基地址
mov bx ,0
mov ax,[bx]
mov si ,0
mov ax,[si]
mov di ,0
mov ax,[di]
assume cs:codesg ,ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
code segment
start:
mov ax,datasg
mov ds,ax
mov si,0
mov di,16
mov cx,8
s:mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00h
int 21h
code ends
end start
26、[bx+si] 和[bx+di] 基址变址寻址
mov ax,[bx+si] //bx+si bx中的数值加上si中的数值
27、[bx+si+2] 和[bx+di+2] 相对基址变址寻址
28、转移指令
29、jmp跳转指令
30、call 和ret指令
31、标志寄存器
32、中断 处理