?寻址方式 (实模式 ):
1,立即数寻址 MOV AX,1234H
2,寄存器寻址 MOV AX,BX
3,直接寻址 MOV AX,[1234H]
4,寄存器间接寻址 MOV AX,[BX]
5,基址寻址 MOV AX,[BX+100H]
6,变址寻址 MOV AX,[SI+100H]
7,基址加变址寻址 MOV AX,[BX+SI]
8,带位移的基址加变址寻址
MOV AX,[BX+SI+100H]
数据结构的基址寻址方式
字段 0
字段 n
字段 n-1
字段 2
字段 1
基址寄存器
+
(位移量)
MOV AX,[BX+100H]
(位移量)
数据阵列的变址寻址方式
单元 0
单元 n
单元 n-1
单元 2
单元 1
变址寄存器
+
MOV AX,[SI+100H]
单元 (0,0)
单元 (0,1)
单元 (0,n)
(位移量)
二维数据阵列的基址加变址寻址方式
基址寄存器
+
MOV AX,[BX+SI+100H]
单元 (1,0)
单元 (1,n)
单元 (1,1)
单元 (m,n)
变址寄存器
+
调试程序 DEBUG
R——寄存器命令
标志 置位 复位
OF OV NV
DF DN UP
IF EI DI
SF NG PL
ZF ZR NZ
AF AC NA
PF PE PO
CF CY NC
A F P F c f
PF
功能:检查或修改
寄存器的值
R [寄存器名 ]
调试程序 DEBUG
D——转储命令
功能:检查存储器
的内容
D [内存地址 ]
调试程序 DEBUG
E——输入 命令
功能:检查或修改
存储器的内容
E [内存地址 ]
?回车:结束输入命令
?空格:不修改存储器内
容,显示下一个
存储单元的内容
?输入新值,后回车或空格
调试程序 DEBUG
A——汇编命令
功能:汇编程序指令
A [起始地址 ]
U——汇编命令
功能:反汇编程序指令
U [起始地址 ]
调试程序 DEBUG
T——跟踪 命令
功能:跟踪程序执行
T=[起始地址 ][指令条数 ]
调试程序 DEBUG
R——运行 命令
功能:运行程序
G=[起始地址 ]
?算术运算指令的例子
1,设两个十进制数 1234和 5678分别存放在数据
段中从 1000H和 2000H开始的单元中,计算这两
个数的和,结果存放在 3000H开始的单元中
MOV AL,[1000]
ADD AL,[2000] ;低字节相加
DAA ;十进制调整
MOV [3000],AL ;存低字节和
MOV AL,[1001]
ADC AL,[2001] ;高字节带进位相加
DAA ;十进制调整
MOV [3001],AL ;存高字节和
?算术运算指令的例子
2,实现非压缩 BCD数 6?8=48的程序
MOV AL,06
MOV BL,08
MUL BL ;
AAM ;
AX (AL)?(BL)
十进制调整,使 (AX)=0408
?算术运算指令的例子
3,实现非压缩 BCD数 17?5=3余 2的程序
MOV AX,0107
MOV BL,05
AAD ;
DIV BL ; 除法,得商 (AL)=03,
余数 (AH)=02
十进制调整,使 (AX)=0011
第三章 Pentium微处理器的指令系统
3.1 概述
3.2 Pentium微处理器的寻址方式
3.3 数据传送指令
3.4 算术运算指令
3.5 逻辑运算指令
3.6 串操作指令
3.7 程序控制指令
3.8 保护模式的系统控制指令
3.9 浮点运算指令
3.10 MMX指令简介
3.5 逻辑运算指令
?位操作
AND 目标操作数,源操作数
OR 目标操作数,源操作数
XOR 目标操作数,源操作数
NOT 目标操作数
?位操作
AND 主要用于将二进制数的某些位清 0
AND BL,0FH
xxxxxxxx (BL)
00001111 0F
0000xxxx 结果
AND
?位操作
OR 主要用于将二进制数的某些位置 1
OR BL,0FH
xxxxxxxx (BL)
00001111 0F
xxxx1111 结果
OR
?位操作
XOR 主要用于将二进制数的某些位求反
XOR BL,0FH
xxxxxxxx (BL)
00001111 0F
xxxxxxxx 结果
XOR
?移位操作
指令格式:
SHL 目标操作数,计数
移 1位时,计数值可以为立即数 1
移多位时,计数值必须先存入 CL寄存器
MOV CL,3
SHL AX,CL
P.93
?位测试
TEST 用于测试二进制数的某些位 (一般为 1位 )
TEST AL,1
JNZ RIGHT
TEST AL,128
JNZ LEFT
当被测试为为 0时,ZF置位( ZF=1) ;
当被测试为为 1时,ZF复位( ZF=0)
?位测试
位测试, BT 目标操作数,源操作数
位测试置 0,BTR 目标操作数,源操作数
位测试置 1,BTS 目标操作数,源操作数
位测试取反, BTC 目标操作数,源操作数
测试目标操作数中由源操作数指定的位,将
其值送 CF标志
源操作数以目标操作数的长度为模
MOV AX,1FF0H
BTS AX,24
?位扫描
向前位扫描, BSF 目标操作数,源操作数
向后位扫描, BSR 目标操作数,源操作数
对源操作数进行扫描,将遇到的第一个 1所
在的位置送目标操作数,并将 ZF清 0。
如果源操作数为 0,则目标操作数不变,且
ZF置 1 MOV EAX,60000000H
BSF EBX,EAX
3.6 串操作指令
?串传送
MOVSB
MOVSW
MOVSD
将一个字节 /字 /双字从
DS:SI ES:DI
指令前要先将源串首地址 DS:SI
目标串首地址 ES:DI
完成操作后自动修改 SI,DI,使其指向串
的下一个元素
?串传送
完成操作后自动修改 SI,DI,使其指向串
的下一个元素
串操作方向由 CLD和 STD指令设置
CLD 地址递增方向( DF=0)
STD 地址递减方向( DF=1)
?串传送
——重复前缀
需要先将串的长度存入 CX寄存器
每处理完一个元素自动使 CX-1,直到 CX=0
才结束串传送 ——完成整个串的传送
REP MOVSB
REP MOVSW
REP MOVSD
例,P.96
例:
?串传送
MOV SI,OFFSET S1
MOV DI,OFFSET S2
MOV CX,18
REP MOVSB
….
S1 DB,This is a string!$”
S2 DB 18 DUP(0)
?串比较
CMPSB
CMPSW
CMPSD
比较地址为 DS:SI,ES:DI的两
个字节 /字 /双字
指令前通常加重复前缀 REPZ/REPE,从而
当发现两个串不同时结束比较。
例:
?串比较
MOV SI,OFFSET S1
MOV DI,OFFSET S2
MOV CX,xx
REPZ CMPSB
JNZ Not_Equal
Equal:
……
Not_Equal:
…...
?串搜索
SCASB
SCASW
SCASD
在首地址为 ES:DI的串中搜索
某个元素(字节 /字 /双字)
事先要将待搜索的元素存入 AL/AX/EAX
指令前通常加重复前缀 REPNZ/REPNE,
从而当发现待搜索的元素时结束搜索。
例:
?串搜索
MOV DI,OFFSET String
MOV CX,xx
MOV AL,?h?
REPNZ SCASB
JNZ Not_Found
Found:
……
Not_ Found:
…...
?串装入
LODSB
LODSW
LODSD
将地址为 DS:SI的一个字节 /字 /
双字装入 AL/AX/EAX
串装入指令没有重复前缀
例,MOV SI,OFFSET String
MOV CX,xx
MOV AH,2
LODSB
MOV DL,AL
INT 21
LOOP NextChar
NextChar:
?串装入
?串存储
LODSB
LODSW
LODSD
将 AL/AX/EAX的值存入地址
为 ES:DI的内存单元
利用重复前缀 REP,可以建立一个取值相
同的数据串
3.7 程序控制指令
控制程序的流向:
无条件转移
条件转移
循环控制
过程调用与返回
中断
?无条件转移
JMP Label1
.…..
Label1:
?条件转移
相当于 goto语句
根据执行上一指令后标志寄存器的状态而
决定是否转移
?条件转移
根据执行上一指令后标志寄存器的状态而
决定是否转移
JA >
JAE >=
JB <
JBE <=
JG >
JGE >=
JL <
JLE <=
JG 标号
?条件转移
JZ
JNZ
JC
JNC
JO
JNO
JP
JNP
JS
JNS
JCXZ
?循环控制
LOOP
LOOPE/LOOPZ
LOOPNE/LOOPNZ
与 CX配合使用,CX存放循环次数
第四章 汇编语言程序设计
4.1 概述
4.2 汇编语言的基本语法
4.3 汇编语言程序的控制结构
4.4 DOS/BIOS中断调用
4.5 保护模式下的汇编语言程序设计
4.6 Win32汇编语言程序设计
4.7 与高级语言的接口
4.1 概述
汇编语言程序的上机处理过程
主要的汇编程序,MASM,TASM
实模式汇编语言源程序的结构
DATA SEGMENT
…...
DATA ENDS
STACK SEGMENT STACK
…...
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START,……
CODE ENDS
END START
4.2 汇编语言的基本语法
1,常量、变量和表达式
?常量
二进制 xxxxxxxxB 01000101B
八进制 xxxO 或 xxxQ 721O或 721Q
十进制 xxxx或 xxxxD 1991或 1991D
十六进制 xxxxH 0F1D4H
字符串 ‘ xxx?或, xxx” ?AB?
数值常量、符号常量(用 EQU或 =定义)
?变量
内存单元的名字,由 DB/DW/DD/DQ/DT定义
BUF DB?
MOV BUF,AL
变量的三种属性:
段值 SEG
偏移量 OFFSET
类型 BYTE/WORD/...
?标号
指令存放单元的符号地址,是转移 /调用 /循环
指令的操作数
标号的三种属性:
段值 SEG
偏移量 OFFSET
类型 NEAR/FAR
?表达式
由操作数和运算符组成的序列
操作数可以是寄存器、常量(数值常量、符
号常量)、存储器操作数(标号、变量)
运算符包括:算术运算符、逻辑运算符、关
系运算符、数值返回运算符和属性运算符
数值返回运算符(分析运算符)
SEG 变量 /标号
OFFSET 变量 /标号
TYPE 变量 /标号
变量返回类型,1字节,2字,4双字
标号返回类型,-1NEAR,-2FAR
LENGTH 变量
SIZE 变量
属性运算符(合成运算符)
?PTR
类型 PTR 表达式
MOV WORD PTR [BX],0
?THIS
THIS 类型
MY_BYTE EQU THIS BYTE
MY_WORD DW 100 DUP(?)
2,指令语句
标号,指令助记符 操作数 ;注释
3,伪指令语句
名字 伪操作命令 操作数 ;注释
?符号定义语句
定义符号常量
PRICE EQU 281
PORT = 6
PORT = PORT +1
?数据定义语句
定义变量、分配存储单元等
变量名 DB/DW/DD/DQ/DT 操作数,…,操作数
操作数可以是:数值表达式或表、字符串、?、
N DUP表达式
VAR DW?
ARRAY DB 100 DUP (0)
?段定义语句
P,131
?过程定义语句
P,131
?程序结束语句
END 表达式
表达式为程序的第一条指令的地址
4.3 汇编语言程序的控制结构
分支结构
程序段 1 程序段 2
条件
JZ L1
L1,……
…...
L2,…...
后继程序 L3,…...
JMP L3
TEST AX,1
Y N
程序段 1
后继程序
条件
JZ L1
L1,……
…...
…...
TEST AX,1
分支结构
Y N
循环结构
先执行、后判断
初始化部分
循环体
修改部分
条件
先判断、后执行
初始化部分
循环体
修改部分
条件
后继程序
循环结构
循环结构
循环控制:计数控制 LOOP
条件控制 JZ/...
4.4 DOS/BIOS中断调用
习题
1,已知 (CS)=0A00H,(DS)=0B00H,(SI)=0100H,(DI)=0200H,
(BX)=0300H。指出下列指令中源操作数的寻址方式,并计算③ -⑦
小题操作数的物理地址。
① MOV AX,1234H
② MOV AX,BX
③ MOV AX,[SI]
④ MOV AX,[1234H]
⑤ MOV AX,[BX+400H]
⑥ MOV AX,[BX+SI]
⑦ MOV AX,[BX+DI+0400H]
2,已知 (AX)=701FH,(BX)=13F1H。指出执行下列指令后目标操作
数的内容和状态标志位的状态。
SF ZF AF PF CF OF
① ADD AX,BX (AX)= H ;
② SUB AX,BX (AX)= H ;
③ AND AX,BX (AX)= H ;
④ OR AX,BX (AX)= H ;
⑤ XOR AX,BX (AX)= H ;
⑥ IMUL BL (AX)= H ;
⑦ MUL BH (AX)= H ;
⑧ SHR AX,2 (AX)= H ;
⑨ SAR AX,2 (AX)= H ;
⑩ SHL AX,2 (AX)= H,
3.已知 (CS)=1075FH,(IP)=0300H,(SI)=0100H,(DS:100H)=00H,
(DS:101H)=10H。指出执行下列指令后程序控制转到何处。
① JMP 10H
② JMP 1000H
③ JMP WORD PTR [SI]