微机原理与接口技术--西安电子科技大学-笔记三
前言
笔记三已经更到第四章了,第四章剩下的就是例程讲解了,在此吹爆周老师的课。
例3.30
校验和不要进位—数据通信—奇偶校验+和校验
DATA SEGMENT
BUFFER DB 15 DUP(?)
DB ?
DATA ENDS
CODE SEGMENT
ASSNME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET BUFFER
MOV CX,15
XOR AL,AL;AL清零
L1: ADD AL,[SI]
INC SI
LOOP L1
MOV [SI],AL
MOV AL,04h
INT 21H
CODE ENDS
END START
例3.31
测试BX中1的个数(先循环判定)
MOV CX,16
MOV AX,0
L2:SHR BX,1
JNC L1
INC AX
L1:LOOP L2
MOV CX,16
MOV CX,0
MOV AX,0
L2:CMP BX,0
JZ EXIT
SHR BX,1
JNC L1
INC AX
LOOP L2
EXIT: MOV AH,04H
INT 21H
子程序调用与返回指令&&子程序的设计技术
子程序的概念
- 类似于C语言中的函数
子程序(过程)定义
1. 子程序名 PROC(伪指令) [类型]
2. 类型:段内子程序--NEAR--缺省;段间子程序--FAR--必写
3. 过程体
4. RET;返回---RET F可以写成RET
5. 子程序名 ENDP
1 PROC与ENDP的子程序名一致
2.
3. 过程名一旦定义了,就具有了三个属性
段地址
EA
类型的属性
子程序调用与返回
段内子程序调用与返回
CODE SEGMENT
ASSUME CS:CODE
START:
……
CALL SUB1;段内直接寻址
……当前IP CS不发生改变
MOV AH,4CH
INT 21H
SUB1 PROC
RET
SUB1 ENDP
CODE ENDS
END START
- (IP)---->SP-2;字单元
- 当前IP+DISP;DISP==当前IP到目标地址差
- RET:以SP为栈顶地址,弹出给IP----SP+2;SP恢复
段间子程序调用与返回
CODE1 SEGMENT
ASSUME CS:CODE1
START:
……
CALL FAR PTR SUB1;段内直接寻址
……CS:IP(CS和IP都要保存)
MOV AH,4CH
INT 21H
CODE1 ENDS
CODE2 SEGMENT
ASSUME CS:CODE2
SUB1 PROC FAR
……
RET
SUB1 ENDP
CODE2 ENDS
END START
- 使用堆栈进行现场保护
- (CS)—>SP-2;(IP)---->SP-2;
- SET SUB1—>CS;OFFSET SUB1---->IP
- RET ;以SP为栈顶地址,弹出给IP----SP+2再弹出CS;SP+2—恢复
- 如果子程序的实体破环了SP,一定要恢复SP,PUSH和POP一定要配对
信息的保护与恢复
- 在调用子程序时要把数据入栈,保护数据
- 在返回后出栈进行数据恢复
- 一般在子程序中进行
主程序与子程序之间的参数的传递方法
- 入口参数—出口参数
- 采用寄存器传递–太少
- 存储器单元在数据段定义MEM,call之前记到MEM,子程序调用读取
- 堆栈区也可以传递,注意SP的变化
子程序说明文件
- ;开头
- ;子程序名
- ;子程序的功能
- ;入口参数
- ;出口参数
- ;所使用的寄存器和存储单元
- ;举例(略)
子程序允许嵌套
- 嵌套时注意堆栈溢出
子程序递归
子程序可再用
- 中断请求—执行完中断服务子程序
例程–例4.9
STACK SEGMENT STACK
DW 200 DUP(?)
STACK ENDS
DATA SEGMENT
BUF DB ''
COUNT EQU $-BUF
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
;寄存器传参
MOV CX,COUNT
LEA SI,BUF
CALL
MOV AH,04H
INT 21H
SETEVN PROC
PUSH AX
PUSH BX
PUSH CX
PUSH SI
MOV AL,[SI]
CALL COUNTBACK
AND BL,01H
JZ SETEVN
DATA SEGMENT
DATA1
DATA2
;传参
MOV CX,COUNT
MOV DATA1,CX
MOV DATA2,AX
;获取
MOV CX,COUNT
PUSH CX
LEA SI,BUF
PUSH SI
;获取
PUSH BP
MOV BP,SP;SS:(BP)--->SP
MOV SI,(BP)+OCH; 不破换SP
MOV CX,(BP)+DISP;
- 注意SP的变化以及恢复SP,RET 4;带参数的返回
中断调用与返回指令以及第八章知识点
中断定义
中断源定义
- CPU内部和外部
- 内部
除法错(N=0)、单步中断(TF = 1)(N=1)、断点中断(INT 3)(N=3)、INTO 溢出中断(OF)(N=4)、INT n(N=n)
为了识别中断源,给每个中断源编排了中断类型号(0-255)
- 外部
NMT–非可屏蔽 (N=2)\上升沿\不受IF的控制
INTR–受IF中断标志位控制\高电平有效\N不固定\在8086扩展一个中断控制器(8259A),8个请求中断段连接8个中断源,通过INT向INTR请求,中断控制器可以通过数据线与CPU连接,可以初始化,配置中断控制器,配置R0的N就可,其余的依次
中断类型号
中断向量
- 在响应中断请求时,先执行完当前指令,保护中断现场(CS:IP\PSW)。IP\CS\PSW–>依次压栈保护
- 就是中断服务子程序的入口地址(32 段地址:偏移地址)
中断向量表
- 1K—存放中断向量表----4个单元—一个中断向量
- 已知N,在中断向量表找到中断子程序的入口地址—N4----N4(IP):N+2(CS)
- IRET----中断返回
中断响应过程
- 内部和不可屏蔽:保护现场—P71
- 可屏蔽:要用过^INTA发送一个低脉冲告诉中断控制器响应,第二是问N,通过数据线读取
系统调用
- DOS系统调用
01H----等待用户从键盘输入一个字符,回显,被按键的ASIIC–>AL
AGIN:MOV AH,01H
INT 21H
;组合就退出程序
CMP AL,'1'
JB AGIN
CMP AL,'5'
JA AGIN
AND AL,0FH
SUB AL,1
SHL AL,1
CBW ;扩展
LEA BX,TABLE
ADD BX,AX
JMP WORD PTR [BX]
DATA SEGMENT
TABLE DW G1,G2,G3...;地址(OFFSET)表,(N-1)*2
G1:
……
G2:
……
G3:
……
利用跳转表法
LEA BX,TABLE
ADD BX,AX
JMP BX; (BX)--->IP
TABLE:JMP SHOTR G1 +0
JMP SHOTR G2 +2
JMP SHOTR G3 +4
JMP SHOTR G4 +6
JMP SHOTR G5 +8;二级桥跳转
//TABLE:JMP G1 +0
JMP G2 +3
JMP G3 +6
JMP G4 +9
JMP G5 +12;二级桥跳转
G1:
……
G2:
……
07H;不回显
08H
02H—向屏幕输出一个字符
MOV AH,02H
MOV DL,'5'
INT 21H
05H–打印机
回车—0DH
换行–0AH
空格—20H
MOV AH,2
MOV DL,0DH;入口参数
INT 21H
MOV AH,2
MOV DL,0H
INT 21H
06H 与DOS功能调用—控制台输入、输出
MOV AH,06
MOV DL,0FFH;(DL)=00H~FEH--->输出;(DL)==0FFH,输入;不等带
INT 21H;若没有按键,ZF == 1 ;若按键,ZF ==0;数据在AL
JZ NAJ
CMP 1BH;1BH--ESC的ASCII值
JE START
NAJ:
09H—向屏幕输出一串字符
DATA SEGMRNT
STRING DB '2.Find the maximum of string;','0DH,0AH,$';'$'结束符
……
DATA ENDS
CODE SEGMRNT
ASSUME CS:CODE,DS:DATA
START:
MOV DATA
MOV DS,AX
MOV AH,9
LEA DX,STRING
INT 21H
……
MOV AH,4CH
INT 21H
CODE ENDS
END STRAT
0AH—从键盘输入一串字符(等待
DATA SEGMENT
……
KEYbuf1 DB 20H;允许用户输入的字符个数
DB ?;用来统计实际输入的字符数
KEYbuf2 DB 20H DUP(?);存放实际输入的字符串
;键盘输入缓存区
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
……
;从键盘输入一串字符,有回显
MOV AH,0AH
MOV DX,OFFSET KEYbuf1
INT 21H
……
4.12 — 4.10 — P156\4.39
时间的设置和获取
2DH---时间设置
MOV AH,2DH
MOV CH,时
MOV CL,
MOV DH,
MOV DL,1/100秒
INT 21H ;(AL)==0;成功
2CH ---时间获取
MOV AH,21H
INT 21H;CH\CL\DH\DL---二进制时间要转为十进制---再转成ASCII---显示---BUF
;视觉残存
- BIOS功能调用
00H —设置显示器,清屏功能
MOV AH,00H
MOV AL,3;彩色文本,80X25
MOV BX,0;页数,与显卡数据缓存区有关
NT 10H
02H—设置光标位置
MOV AH,02H
MOV DH,行
MOV DL,列
MOV BL,0
INT 10H
字符串操作指令(5)
- 数据块(字符串)
- 源、目的字符串
特点
- 源与目的串的寻址方式都是隐含寻址
-
- 如果源串在存储器中,则存储器的的地址在DS:SI;若在REG中字节:AL,字:AX
- 目的串,必须在ES:DI;在REG同上
- CPU执行后,SI、DI的地址会自动改变,受DF的控制,DF=0,+;DF=1,-;±的数量受操作类型的控制
- 在串操作指令的左边可以增加重复前缀,重复次数在CX中
串传送指令 (REP) MOVSB/MOVSW
- MOVSB/MOVSW/
- MOVSB
(ES:DI) < ---- (DS:SI)
(SI)±1—>SI;(DI)±1—>DI
(CX)-1—>CX;若CX != 0;重复执行
- MOVS DST,SRC;根据操作数的类型进行编译;保证类型一致
- 例3.36
DATA SEGMENT
BUFFER1 DB 100 DUP(?)
BUFFER2 DB 100 DUP(?)
DATA ENS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,BUFFER1
MOV DI,OFFSET BUFFER2
CMP SI,DI
//JB DZJXFX
MOV CX,100
/*CLD ;DF=0
REP MOVSB */
N1: MOV AL.[SI]
MOV ES:[DI],AL
INC SI
INC DI
LOOP N1
MOV AH,4CH
INT 21H
CODE ENDS
END STRAT
- 若源数据块和目的数据块重叠,从末尾开始;CMP SI,DI
串比较指令 (REPE/REPZ)(REPNE/REPNZ) CMPSB/CMPSW–影响标志
- CMPSB/CMPSW/CMPS DST,SRC
- CMPSW
(SRC)-(DST)—(DS:SI)-(ES:DI);根据差的结果设置6个状态位,ZF
(SI)(DI)±2;
REPZ CMPSW ;(CX)-1–>CX;若CX != 0&&ZF==1;重复执行
- 例3.37
MOV SI,OFFSET BUFFER1
MOV DI,OFFSET BUFFER2
MOV CX,100
CLD
REPNZ CMPSW
JZ Find
MOV ADDR,0FFFFH
JMP EXIT
Find:SUB SI,2
MOV ADDR,SI
……
MOV AH,4CH
INT 21H
串扫描(搜索)指令 (REPNE/REPNZ) (REPE/REPZ) SCASB/SCASW–影响标志
- SCASB/SCASW/SCAS DST
- REPNZ SCASB
(AL)-(ES:DI);设置六个状态标志位ZF,存储区在目的
DI±1—>DI;
(CX)-1—>CX,若CX != 0&&ZF==0,没找到,重复执行
找到后ZF = 1,在DI-1中
串装入指令 (REP) LODSB/LODSW
- LODSB/LODSW
- LODSB
DST:AL; SRC:DS:SI
(DS:SI)—>AL
(SI)±1—>SI
在串口接收端口有缓存区SBUF,一个LOD,一个STO
串存贮指令 (REP) STOSB/STOSW
- STOSB/STOSW
- STOB
AL—>(ES:DI)
DI±1
- 例3.39
DATA SEGMENT
BUFFER1 DW
BUFFER2 DW
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
STRAT:
LEA DI,BUFFER1
MOV AX,0000H
MOV CX,200
CLD
REP STOW
- 例4.7
输入输出指令
输入指令
- IN DST,SRC;SRC—>端口地址(0-65533,64K)
0-255;直接寻址;IN AX,端口地址
255;MOV DX,端口地址;IN AX,DX
相邻的两个8位—>字单元
输出指令
- OUT DST,SRC;DST:AX/AL;SRC:IO地址
- 输入输出指令工作时间要多一个周期(5个周期)—>总线周期—>T1\T2\T3\TW(等待)\T4
其他指令
空操作
- NOP—3个周期
- 延时子程序
MOV BX,
L2: MOV CX,0;65536
L1: NOP
LOOP
DEC BX
JNE L2
暂停指令
- HLT
- 硬件退出不执行下面
- INTR加中断请求信号,如果响应中断,则保护现场
宏指令
- 用户自己开发的,先定义后使用
- 宏指令的定义
宏指令名 MACRO [形式参数1,形参2……]
……;宏体
ENDM
;定义一条宏指令,将某通用寄存器REG左/右移若干次
SHIFT MACRO REG,DIR,N
MOV CL,N
DIR REG,CL//S&DIR REG,Cl
ENDM
-
宏调用
SHIFT AX,HL,3;(AX)逻辑左移3
SHIFT BL,AR,4;(BL)算数右移4 -
把宏体插入汇编,实参代替形参;汇编后左边带有加号
-
省时间,非空间
;定义一条宏指令,完成回车换行
CRLF MACRO
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
ENDM
-
宏展开
-
避免标号重复
;数据块搬家
DATAMOV MACRO DATA1,DATA2,N
LOCAL NEXT;NEXT是局部标号
LEA SI,DATA1
LEA DI,DATA2
MOV CX,N
NEXT: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP NEXT
ENDM
……
DATAMOV buf1,buf2,100
//汇编展开;NEXT---LOOP ??0000
DATAMOV buf3,buf4,200
//汇编展开;NEXT--->LOOP ??0001
上一篇: 为什么项目估算偏差如此之大?
下一篇: Sun进入持续集成商业市场