第1章 基础知识
1.15 内存地址空间
8086CPU内存地址分配
第2章 寄存器
实验1 查看CPU和内存 Debug的使用
常用的几个命令
按Alt+Enter可进入\退出全屏模式
用e命令向内存中写入字符或字符串
e 1000:0 '1' 'a' 'b' 'c' *//写入字符*
e 1000:0 "abcde" 2 'x' "1+2+3=?" *//写入字符串*
第3章 寄存器(内存访问)
3.1内存中字的存储
N地址单元存放的字节型数据
N地址字单元存放的字型数据——N地址为起始
3.2 DS和[address]读写内存的方法
8086CPU以 段地址:偏移地址的形式操作内存单元
程序中默认在DS寄存器中存放段地址
程序中以[address]的形式表示偏移地址
8086CPU中不允许直接改变段地址寄存器的值
例如:读取100066H地址单元的字节
mov ax,1000
mov ds,ax
mov bl,[66] //解释:mov bl,1000:66
3.7 CPU提供的栈机制
SS和SP分别存放栈的段地址和偏移地址
8086CPU入栈和出栈都是以字为单位操作的
入栈时,栈指针由高地址向低地址移动
出栈时,栈指针由低地址向高地址移动
栈的大小:为16的倍数
3.9 push和pop指令
支持三种形式
push/pop 寄存器/段地址寄存器/内存单元
mov ax,1000
mov ds,ax
push [0] //mov ss:sp 1000:0
push指令的执行步骤:1)sp -= 2; 2)将ss:sp中的字型数据取出
pop指令的执行步骤: 1)将ss:sp中的字型数据取出;2)sp += 2
实验2
注意:Debug中用t命令执行指令时,若修改段地址寄存器SS,则下一条语句会被自动执行。
第4章 第一个程序
4.2 源程序
asume cs:code
code segment
mov ax,0123h
mov bx,0456h
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
code ends
end
汇编语言的源程序包含两种指令:
1)伪指令——编译器执行
a)定义程序段
xxxx segment
…
xxxx ends
b)结束编译:end
c)关联段地址寄存器:asume
asume cs:code,ds:data,ss:stack
2)汇编指令——CPU执行
程序返回指令:
mov ax,4c00h
int 21h
4.9 程序执行过程的跟踪
执行程序载入之后:
1)CX寄存器中存放的值表示程序的大小
2)CS:IP存放程序执行地址
3)DS寄存器存放PSP的地址,PSP区大小为256个字节,PSP之后紧跟代码区
即 CS:IP = DS + 10h
第5章 [bx]和loop
5.1 [bx]
[bx]表示一个地址单元,偏移放在bx寄存器中
mov ax,[bx] //(ax) = ((ds)*16+(bx))
5.2 loop和cx
计算 2^10
mov ax,2
mov cx,9
lp: add ax,ax
loop lp
5.3 debug中p命令和g命令
p:可以执行到循环结束
g 偏移地址:相当于断点执行到ds:偏移地址的地方
5.4 debug和编译器masm对指令的不同处理
debug中:mov ax,[0] 相当于 mov ax,ds:0
masm编译:mov ax,[0] 相当与 mov ax,0
访问ds:0处的内存单元应写成:
mov bx,0
mov ax,[bx]
或者
mov ax,ds:[0]
5.6 段前缀
mov ax,20h
mov es,ax
mov es:[0h],ax
出现在访问内存单元的指令中,用于显示的表示内存单元段地址的“ds”,“cs”,“ss”,“es”,在汇编语言中称之为段前缀。
第6章 包含多个段的程序
6.1在代码段中使用数据
1)dw 0123h,0456h,0789h
dw(define word)的含义是定义字型数据
db(define byte)的含义时定义字节型数据
2)代码结束时end后面加标号,则指明代码入口
assume cs:code
code segment
....
数据
...