微机原理与应用前几章内容#复习#考试

AX存放数据信息,通过I/O接口进行传递,只能存放数据
BX存放地址+存放数据,间接寻址,基址寄存器
CX存放循环/串操作中的计数值,只能存放计数值,串长度必须由CX指定
DX在间接寻址I/O指令中存放I/O端口地址,在32位乘除法运算中存放高16位数据
SP堆栈中存放偏移地址,相当于C语言中的指针,只能指向栈顶
BP堆栈中可以指向任何位置,它存放内存单元偏移地址,可以存放中间运算结果,间接寻址,基址寄存器
!!!有堆栈时SP被专用,BP不一定
SI源变址寄存器,间接寻址,变址寄存器,串操作中的源串偏移地址由SI指定,在数据段
DI目标变址寄存器,间接寻址,变址寄存器,串操作中的目标串由DI指定,在附加段
IP下一条指令的偏移地址,指针指到哪里就执行哪条指令
FLAGS存放运算结果的特征,有16位,只有9位是有效的:
状态标志位:运算结果特征
CF:最高位有进位CF=1
SF:最高位位=1,SF=1
AF:第三位向第四位借位/进位,AF=1
PF:1的个数为偶数,PF=1
OF:有溢出OF=1
ZF:结果为0,ZF=1
控制标志位:处理器当前状态
IF:中断允许,IF=1,CPU可以响应可屏蔽中断请求
TF:CPU在单步执行指令
DF:方向标志位,串操作的时候用到,确定操作方向

以下寄存器存放段基地址,决定这个段在内存的位置
CS:代码段寄存器
DS:数据段寄存器
ES:附加段寄存器
SS:堆栈段寄存器



MOV AX,VAR[BX][SI]基址变址相对寻址
VAR=0050H
BX=0800H
SI=00A0H
用的是BX,所以在数据段,数据段寄存器已给出,DS=6000H
偏移地址=BI+VAR+SI=08F0H
物理地址=段首地址+偏移地址=608F0H


MOV赋值
PUSH堆栈压栈
POP堆栈出栈
XCHG两个数交换
XLAT查表,BX为首地址,AL为表内偏移量,BX+AL为元素地址,BX+AL=AL
CBW将AL扩展为AX
CWD将AX扩展到DX
LEA近地址指针,将变量的偏移地址写入目标寄存器,程序中用符号表示内存偏移地址时,要用这条指令,使用频率高
LDS远地址指针,跟上面差不多,不过要考虑段地址,段地址送给DS
LES远地址指针,跟上面差不多,不过要考虑段地址,段地址送给ES


接口里的寄存器叫端口
IN输入指令
OUT输出指令
acc是AX,AL,但不可能是AH


ADD普通加法指令
ADC带进位的加法指令
INC加一指令
CLC,CF清零指令



SUB普通减法指令
SBB带进位的减法指令
DEC减一指令
NEG用0减去一个数 CF=1,除了这个数是0
操作数是80H或8000H时,结果不变,OF=1,其他时候OF=0
CMP执行后不要结果,只影响标志位
OF,SF相同,AX》SF
OF,SF不同,AX《SF

MUL无符号乘法
IMUL有符号乘法


逻辑运算指令OF=CF=0
and 与,有清零作用,跟0相与变成0
and ax,ax 结果相同,OF=CF==0

or 或,有

置1作用,跟1相与变成1
or ax,ax 结果相同,OF=CF==0

xor异或

test测试标志符

不循环
SAL算术左移
SAR算术右移
(有符号数)

SHL逻辑左移
SHR逻辑右移
(无符号数)


循环
ROL
ROR
(不带进位位)

RCL
RCR
(带进位位)

串指令方向
DF=0增地址方向,指针会指向串尾+1
DF=1减地址方向,指针会指向串尾-1
可以加重复前缀构成循环结构
重复前缀:
无条件:REP,CX不等于0时REP后面的指令重复执行
用于传送类之类的前面

条件重复:(运算类指令的循环)
REPE,CX不等于0且ZF=1,前缀后的指令重复执行
REPNZ,CX不等于0且ZF=0,前缀后的指令重复执行

传送数据(常与无条件重复前缀一起用)
MOVS [DI][SI]只适用于需要段重设
MOVSB 按字节传送
MOVSW 按字传送


例子:
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB
HLT

串比较,减完只改变标志位
CMPS
CMPSB
CMPSW
(同上)
(前缀不对标志位影响)


串扫描
(找某个关键字)
SCAS
SCASB AX
SCASW AL

串装入
(一般不加前缀)
LDS
LODSB
LODSW

串存储
(将内存中某个区域置成同样的值)
STOS
STOSB
STOSW

JMP转移
loop循环



OFFSET取变量或标号的偏移地址
SEG取段地址
PTR声明字长
例如:MOV BYTE PTR[BX],12H 字长是byte

伪指令字符串必须由DB定义
?表示随机数
equ 符号定义,就是给变量/常量一个字符

段定义伪指令
段名 SEGMENT[定义类型][组合类型][类别]
……
段名 ENDS


ASSUME段寄存器定义
END结束伪指令



DATA SEGMENT
;灯的地址及初始状态
LIGHT_ADD EQU 200H;灯的地址
LIGHT_STATUS DB 11111110B; 有8个灯,0开1关,通过循环左移ROL实现灯状态变化
;8253的地址
PORT0 EQU 400H; 计数器0端口地址
PORT2 EQU 404H; 计数器2端口地址
PORT3 EQU 406H; 控制端口地址

;控制方式字
CONTROL0 EQU 00010110B;计数器0 只读写低字节,方式3,二进制
CONTROL2 EQU 10110000B;计数器2 先读写低字节后读写高字节,方式0,二进制
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEGIN:
MOV AX,DATA
MOV DS,AX

;设置2号中断向量
NMI_INIT:
PUSH ES
XOR AX,AX
MOV AL,02H
XOR AH,AH
SHL AX,1
SHL AX,1
MOV SI,AX
MOV AX,OFFSET NMI_SERVICE
MOV ES:[SI],AX
INC SI
INC SI
MOV BX,CS
MOV ES:[SI],BX
36 POP ES
37
38
39 ; 8253通道0初始化
40 ; 写入方式控制字
41 MOV DX,PORT3
42 MOV AL,CONTROL0
43 OUT DX,AL
44 ; 计数器0写入计数初值
45 MOV DX,PORT0
46 MOV AL,11001000B; 设定N0=200
47 OUT DX,AL
48
49 ; 8253通道2初始化
; 写入方式控制字
MOV DX,PORT3

MOV AL,CONTROL2
OUT DX,AL
; 计数器2写入计数初值
MOV DX,PORT2
MOV AX,0000000111110100B; 设定N2=500
OUT DX,AL; 写入低字节计数初值
MOV AL,AH; 将高字节的数值赋值给低字节
OUT DX,AL; 写入高字节计数初值

;点亮第一个LED灯
MOV DX,LIGHT_ADD
MOV AL,LIGHT_STATUS
OUT DX,AL

;等待中断
JMP $

; 程序退出
MOV AH,4CH
INT 21H

;中断服务程序
NMI_SERVICE PROC FAR
;点亮下一个LED
MOV DX,LIGHT_ADD
MOV AL,LIGHT_STATUS
ROL AL,1; 循环左移
OUT DX,AL
MOV LIGHT_STATUS,AL; 更新LIGHT_STATUS的值

; 通道2送计数初值,再次启动计数
; 8253通道2初始化
; 写入方式控制字
MOV DX,PORT3
MOV AL,CONTROL2
OUT DX,AL

MOV DX,PORT2
MOV AX,0000000111110100B;
OUT DX,AL; 写入低字节计数初值
MOV AL,AH;
OUT DX,AL; 写入高字节计数初值

IRET; 中断返回
NMI_SERVICE ENDP

CODE ENDS
END BEGIN

相关文档
最新文档