思考,某内存单元的段地址为 12000H,偏移地址为 300H,
请计算该内存单元的物理地址是多少?
实验,在 DEBUG查看该单元的内容。
物理地址 PA = 段地址 + 偏移地址
= 12000 + 300 = 12300H
D:\> DEBUG? ;进入 DEBUG
-D 1200:300? ;查看 1200:300 单元内容
-D 1000:2300? ;查看 1000:2300 单元内容
-D 1230:0? ;查看 1230:0 单元内容
- Q? ;退出 DEBUG
不同的段地址和偏移地址 构成 相同的物理地址,
说明什么?它们看到的是同一个单元吗?
12000H
+ 300H
12300H
10000H
+ 2300H
12300H
12300H
+ 0H
12300H
通过此例说明,每个内存单元有唯一的物理地址,
但 可由不同的段地址和偏移地址构成 。
物理地址相同,就选中同一单元
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器地址 12300H = 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 B
A19 A16 A12 A020根地址线,
实验:利用 DEBUG学习寻址方式在 DEBUG下汇编下列指令,并查看每条指令执行后的结果,
MOV BX,2000h
MOV [BX],CS
思考,如何查看指令 MOV [BX],CS 执行后的结果?
用 R命令可以吗?
操作数 [BX]在哪里?
它的内存地址如何构成?
D:\>DEBUG? ;进入 DEBUG
-A? ;汇编指令
126C:0100 MOV BX,2000?
126C:0103 MOV [BX],CS?
126C:0105?
-R? ;查看指令执行前寄存器的内容
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0100 NV UP EI PL NZ NA PO NC
126C:0100 B83412 MOV AX,1234
-D DS:2000 L20? ;查看指令执行前内存单元的内容
126C:2000 00 44 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4,D.!..4....t3.3.
126C:2010 24 0C 75 09 A0 51 DC 0A-06 4D DC 74 19 7A 21 A8 $.u..Q...M.t.z!.
-T=100? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0103 NV UP EI PL NZ NA PO NC
126C:0103 8C0F MOV [BX],CS DS:2000=4400
-T? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0105 NV UP EI PL NZ NA PO NC
126C:0105 0475 ADD AL,75
-D DS:2000 L10? ;查看指令执行后内存单元的内容
126C:2000 6C 12 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4 l..!..4....t3.3.
-Q?
下面程序段欲完成 (800:400H) ← (200:100H),错在哪里?
5,mov ax,200h
mov ds,ax
mov bx,[100h]
mov ax,800h
mov ds,ax
mov ax,400h
mov [ax],bx
4,mov ax,200h
mov ds,ax
mov ax,800h
mov es,ax
mov es:[400h],[100h]
6,mov ax,200h
mov ds,ax
mov bx,[100h]
mov ax,800h
mov ds,ax
mov cx,[400h]
mov cx,bx
3,mov ds,200h
mov bx,[100h]
mov ds,800h
mov [400h],bx
7,mov ax,200h
mov ds,ax
mov bx,100h
mov ax,800h
mov es,ax
mov si,400h
mov es,si,bx
2,mov ax,200:100h
mov 800:400h,ax
1,mov [800:400h],[200:100h] 课外作业 4讨论一,不会编程操作存储单元 编程 1,2中的错几类常犯错误:
2,MOV AX,200:100H
MOV 800:400H,AX
1,MOV [800:400H],[200:100H]
(1) 先设置存储单元的段地址,偏移地址
MOV AX,200h
MOV DS,AX
MOV BX,100h
3B
2A
10
20
200:100H
DS:BX;源;目的
(2) 再确定是做源操作数,还是目的操作数
MOV AX,[BX]
MOV [BX],DX
采用寄存器间接寻址
MOV AX,[100H]
MOV [100H],DX;源;目的 采用直接寻址
(3) 编程时注意两个单元的段值不同,(800:400H) (200:100H)
要根据采用的寻址方式,对相应的段寄存器赋值 。
MOV AX,200H
MOV DS,AX
MOV BX,[100H]
MOV AX,800H
MOV DS,AX
MOV [400H],BX
虽然能完成功能,但由于更改了堆栈,
在一般的数据传送中,建议不使用 [BP]
MOV AX,200H
MOV DS,AX
MOV BX,[100H]
MOV AX,800H
MOV SS,AX
MOV BP,400H
MOV [BP],BX
(4) 注意指令顺序
MOV AX,200H
MOV DS,AX
MOV AX,800H
MOV DS,AX
MOV BX,[100H]
MOV [400H],BX
完成 (800:400h) (800:100h)
MOV AX,200H
MOV DS,AX
MOV AX,800H
MOV ES,AX
MOV BX,[100H]
MOV ES:[400H],BX
完成 (800:400h) (200:100h)
二,立即数直接传送给段寄存器三,两个操作数均为存储器
4,MOV AX,200H
MOV DS,AX
MOV AX,800H
MOV ES,AX
MOV ES:[400H],[100H]
3,MOV DS,200H
MOV BX,[100H]
MOV DS,800H
MOV [400H],BX
MOV AX,200H
MOV DS,AX
MOV AX,[100H]
MOV ES:[400H],AX
MOV AX,800H
MOV DS,AX
5,MOV AX,200H
MOV DS,AX
MOV BX,[100H]
MOV AX,800H
MOV DS,AX
MOV DX,400H
MOV [DX],BX
MOV DI,400H
MOV [DI],BX
四,寻址方式错 (只能用 BX,BP,SI,DI存放偏移地址 )
[AX] [CX] [DX] [BX+BP] [SI+DI]
五,分不清立即数,寄存器和存储器操作数寄存器在 CPU内部,存储器操作数在内存中
7,MOV AX,200H
MOV DS,AX
MOV BX,100H
MOV AX,800H
MOV ES,AX
MOV SI,400H
MOV ES,SI,BX
MOV BX,[100H]
MOV ES:[SI],BX
6,MOV AX,200H
MOV DS,AX
MOV BX,[100H]
MOV AX,800H
MOV DS,AX
MOV CX,[400H]
MOV CX,BX MOV [400H],BX
注意,
指令 在汇编程序 masm.exe下的格式 与 在 DEBUG下的格式 稍有不同,
DS,MOV [DI],CL
MOV AX,[10+BP+DI]
MOV CL,Value[BX]
MOV DS:[DI],CL
MOV AX,10[BP][DI]
MOV CL,Value[BX]
1,DEBUG下不支持符号编程
2,将来我们不是在 DEBUG下编程程序。
编辑? 汇编? 连接? 调试
EDIT.com MASM.exe LINK.exe DEBUG.exe;将 CL的内容传送到变量 var中
data SEGMENT ;数据段
var DB?
data ENDS
code SEGMENT ;代码段
ASSUME CS:code,DS:data
start,MOV AX,data
MOV DS,AX
MOV var,CL
MOV AH,4CH
INT 21H ;返回 DOS
code ENDS
END start
MOV [var],CL;将变量 var1的内容传送到变量 var2中
data1 SEGMENT ;数据段
var1 DB 12h
data1 ENDS
data2 SEGMENT ;数据段
var2 DB?
data2 ENDS
code SEGMENT ;代码段
ASSUME CS:code,DS:data1,ES:data2
start,MOV AX,data1
MOV DS,AX
MOV CL,[var1]
MOV AX,data2
MOV ES,AX
MOV ES:[var2],CL
MOV AH,4CH
INT 21H ;返回 DOS
code ENDS
END start
…...
12h
……
……
……
……
……
……
……
……
……
……
变量 1
data1:var1
内存变量 2
data2:var2
请计算该内存单元的物理地址是多少?
实验,在 DEBUG查看该单元的内容。
物理地址 PA = 段地址 + 偏移地址
= 12000 + 300 = 12300H
D:\> DEBUG? ;进入 DEBUG
-D 1200:300? ;查看 1200:300 单元内容
-D 1000:2300? ;查看 1000:2300 单元内容
-D 1230:0? ;查看 1230:0 单元内容
- Q? ;退出 DEBUG
不同的段地址和偏移地址 构成 相同的物理地址,
说明什么?它们看到的是同一个单元吗?
12000H
+ 300H
12300H
10000H
+ 2300H
12300H
12300H
+ 0H
12300H
通过此例说明,每个内存单元有唯一的物理地址,
但 可由不同的段地址和偏移地址构成 。
物理地址相同,就选中同一单元
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器地址 12300H = 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 B
A19 A16 A12 A020根地址线,
实验:利用 DEBUG学习寻址方式在 DEBUG下汇编下列指令,并查看每条指令执行后的结果,
MOV BX,2000h
MOV [BX],CS
思考,如何查看指令 MOV [BX],CS 执行后的结果?
用 R命令可以吗?
操作数 [BX]在哪里?
它的内存地址如何构成?
D:\>DEBUG? ;进入 DEBUG
-A? ;汇编指令
126C:0100 MOV BX,2000?
126C:0103 MOV [BX],CS?
126C:0105?
-R? ;查看指令执行前寄存器的内容
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0100 NV UP EI PL NZ NA PO NC
126C:0100 B83412 MOV AX,1234
-D DS:2000 L20? ;查看指令执行前内存单元的内容
126C:2000 00 44 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4,D.!..4....t3.3.
126C:2010 24 0C 75 09 A0 51 DC 0A-06 4D DC 74 19 7A 21 A8 $.u..Q...M.t.z!.
-T=100? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0103 NV UP EI PL NZ NA PO NC
126C:0103 8C0F MOV [BX],CS DS:2000=4400
-T? ;单步执行指令
AX=0000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=126C ES=126C SS=126C CS=126C IP=0105 NV UP EI PL NZ NA PO NC
126C:0105 0475 ADD AL,75
-D DS:2000 L10? ;查看指令执行后内存单元的内容
126C:2000 6C 12 CD 21 88 16 34 DB-F6 C2 80 74 33 A0 33 D4 l..!..4....t3.3.
-Q?
下面程序段欲完成 (800:400H) ← (200:100H),错在哪里?
5,mov ax,200h
mov ds,ax
mov bx,[100h]
mov ax,800h
mov ds,ax
mov ax,400h
mov [ax],bx
4,mov ax,200h
mov ds,ax
mov ax,800h
mov es,ax
mov es:[400h],[100h]
6,mov ax,200h
mov ds,ax
mov bx,[100h]
mov ax,800h
mov ds,ax
mov cx,[400h]
mov cx,bx
3,mov ds,200h
mov bx,[100h]
mov ds,800h
mov [400h],bx
7,mov ax,200h
mov ds,ax
mov bx,100h
mov ax,800h
mov es,ax
mov si,400h
mov es,si,bx
2,mov ax,200:100h
mov 800:400h,ax
1,mov [800:400h],[200:100h] 课外作业 4讨论一,不会编程操作存储单元 编程 1,2中的错几类常犯错误:
2,MOV AX,200:100H
MOV 800:400H,AX
1,MOV [800:400H],[200:100H]
(1) 先设置存储单元的段地址,偏移地址
MOV AX,200h
MOV DS,AX
MOV BX,100h
3B
2A
10
20
200:100H
DS:BX;源;目的
(2) 再确定是做源操作数,还是目的操作数
MOV AX,[BX]
MOV [BX],DX
采用寄存器间接寻址
MOV AX,[100H]
MOV [100H],DX;源;目的 采用直接寻址
(3) 编程时注意两个单元的段值不同,(800:400H) (200:100H)
要根据采用的寻址方式,对相应的段寄存器赋值 。
MOV AX,200H
MOV DS,AX
MOV BX,[100H]
MOV AX,800H
MOV DS,AX
MOV [400H],BX
虽然能完成功能,但由于更改了堆栈,
在一般的数据传送中,建议不使用 [BP]
MOV AX,200H
MOV DS,AX
MOV BX,[100H]
MOV AX,800H
MOV SS,AX
MOV BP,400H
MOV [BP],BX
(4) 注意指令顺序
MOV AX,200H
MOV DS,AX
MOV AX,800H
MOV DS,AX
MOV BX,[100H]
MOV [400H],BX
完成 (800:400h) (800:100h)
MOV AX,200H
MOV DS,AX
MOV AX,800H
MOV ES,AX
MOV BX,[100H]
MOV ES:[400H],BX
完成 (800:400h) (200:100h)
二,立即数直接传送给段寄存器三,两个操作数均为存储器
4,MOV AX,200H
MOV DS,AX
MOV AX,800H
MOV ES,AX
MOV ES:[400H],[100H]
3,MOV DS,200H
MOV BX,[100H]
MOV DS,800H
MOV [400H],BX
MOV AX,200H
MOV DS,AX
MOV AX,[100H]
MOV ES:[400H],AX
MOV AX,800H
MOV DS,AX
5,MOV AX,200H
MOV DS,AX
MOV BX,[100H]
MOV AX,800H
MOV DS,AX
MOV DX,400H
MOV [DX],BX
MOV DI,400H
MOV [DI],BX
四,寻址方式错 (只能用 BX,BP,SI,DI存放偏移地址 )
[AX] [CX] [DX] [BX+BP] [SI+DI]
五,分不清立即数,寄存器和存储器操作数寄存器在 CPU内部,存储器操作数在内存中
7,MOV AX,200H
MOV DS,AX
MOV BX,100H
MOV AX,800H
MOV ES,AX
MOV SI,400H
MOV ES,SI,BX
MOV BX,[100H]
MOV ES:[SI],BX
6,MOV AX,200H
MOV DS,AX
MOV BX,[100H]
MOV AX,800H
MOV DS,AX
MOV CX,[400H]
MOV CX,BX MOV [400H],BX
注意,
指令 在汇编程序 masm.exe下的格式 与 在 DEBUG下的格式 稍有不同,
DS,MOV [DI],CL
MOV AX,[10+BP+DI]
MOV CL,Value[BX]
MOV DS:[DI],CL
MOV AX,10[BP][DI]
MOV CL,Value[BX]
1,DEBUG下不支持符号编程
2,将来我们不是在 DEBUG下编程程序。
编辑? 汇编? 连接? 调试
EDIT.com MASM.exe LINK.exe DEBUG.exe;将 CL的内容传送到变量 var中
data SEGMENT ;数据段
var DB?
data ENDS
code SEGMENT ;代码段
ASSUME CS:code,DS:data
start,MOV AX,data
MOV DS,AX
MOV var,CL
MOV AH,4CH
INT 21H ;返回 DOS
code ENDS
END start
MOV [var],CL;将变量 var1的内容传送到变量 var2中
data1 SEGMENT ;数据段
var1 DB 12h
data1 ENDS
data2 SEGMENT ;数据段
var2 DB?
data2 ENDS
code SEGMENT ;代码段
ASSUME CS:code,DS:data1,ES:data2
start,MOV AX,data1
MOV DS,AX
MOV CL,[var1]
MOV AX,data2
MOV ES,AX
MOV ES:[var2],CL
MOV AH,4CH
INT 21H ;返回 DOS
code ENDS
END start
…...
12h
……
……
……
……
……
……
……
……
……
……
变量 1
data1:var1
内存变量 2
data2:var2