微机原理与接口技术--西安电子科技大学-笔记三
前言
笔记三已经更到第四章了,第四章剩下的就是例程讲解了,在此吹爆周老师的课。
例3.30
校验和不要进位—数据通信—奇偶校验+和校验
DATA SEGMENT BUFFER DB 15 DUP(?)DB ?
DATA ENDSCODE SEGMENTASSNME CS:CODE,DS:DATA
START:MOV AX,DATAMOV DS,AXMOV SI,OFFSET BUFFERMOV CX,15XOR AL,AL;AL清零L1: ADD AL,[SI]INC SILOOP L1MOV [SI],ALMOV AL,04hINT 21H
CODE ENDSEND START
例3.31
测试BX中1的个数(先循环判定)
MOV CX,16MOV AX,0
L2:SHR BX,1JNC L1INC AX
L1:LOOP L2
MOV CX,16MOV CX,0MOV AX,0
L2:CMP BX,0JZ EXITSHR BX,1JNC L1INC AXLOOP L2
EXIT: MOV AH,04HINT 21H
子程序调用与返回指令&&子程序的设计技术
子程序的概念
- 类似于C语言中的函数
子程序(过程)定义
1. 子程序名 PROC(伪指令) [类型]
2. 类型:段内子程序--NEAR--缺省;段间子程序--FAR--必写
3. 过程体
4. RET;返回---RET F可以写成RET
5. 子程序名 ENDP
1 PROC与ENDP的子程序名一致
2.
3. 过程名一旦定义了,就具有了三个属性
段地址
EA
类型的属性
子程序调用与返回
段内子程序调用与返回
CODE SEGMENTASSUME CS:CODE
START:……CALL SUB1;段内直接寻址……当前IP CS不发生改变MOV AH,4CHINT 21H SUB1 PROCRET
SUB1 ENDP
CODE ENDS
END START
- (IP)---->SP-2;字单元
- 当前IP+DISP;DISP==当前IP到目标地址差
- RET:以SP为栈顶地址,弹出给IP----SP+2;SP恢复
段间子程序调用与返回
CODE1 SEGMENTASSUME CS:CODE1
START:……CALL FAR PTR SUB1;段内直接寻址……CS:IP(CS和IP都要保存)MOV AH,4CHINT 21H
CODE1 ENDSCODE2 SEGMENTASSUME CS:CODE2
SUB1 PROC FAR……RET
SUB1 ENDP
CODE2 ENDSEND 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 STACKDW 200 DUP(?)
STACK ENDSDATA SEGMENT BUF DB ''COUNT EQU $-BUFCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATAMOV DS,AX;寄存器传参MOV CX,COUNTLEA SI,BUFCALL MOV AH,04HINT 21HSETEVN PROCPUSH AXPUSH BXPUSH CXPUSH SIMOV AL,[SI]CALL COUNTBACKAND BL,01HJZ 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,01HINT 21H;组合就退出程序CMP AL,'1'JB AGINCMP AL,'5'JA AGINAND AL,0FHSUB AL,1SHL AL,1CBW ;扩展LEA BX,TABLEADD BX,AXJMP WORD PTR [BX]DATA SEGMENT
TABLE DW G1,G2,G3...;地址(OFFSET)表,(N-1)*2G1:
……G2:
……
G3:
……
利用跳转表法
LEA BX,TABLE
ADD BX,AX
JMP BX; (BX)--->IP
TABLE:JMP SHOTR G1 +0JMP SHOTR G2 +2JMP SHOTR G3 +4JMP SHOTR G4 +6JMP SHOTR G5 +8;二级桥跳转
//TABLE:JMP G1 +0JMP G2 +3JMP G3 +6JMP G4 +9JMP 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 STARTNAJ:
09H—向屏幕输出一串字符
DATA SEGMRNTSTRING DB '2.Find the maximum of string;','0DH,0AH,$';'$'结束符
……
DATA ENDSCODE SEGMRNTASSUME CS:CODE,DS:DATA
START:MOV DATAMOV DS,AXMOV AH,9LEA DX,STRINGINT 21H……MOV AH,4CHINT 21HCODE 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,DATAMOV DS,AX……;从键盘输入一串字符,有回显MOV AH,0AHMOV DX,OFFSET KEYbuf1INT 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 SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA
START:MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,BUFFER1MOV DI,OFFSET BUFFER2CMP SI,DI//JB DZJXFXMOV CX,100/*CLD ;DF=0REP MOVSB */
N1: MOV AL.[SI]MOV ES:[DI],ALINC SIINC DILOOP N1MOV AH,4CHINT 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 EXITFind: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 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA
STRAT:LEA DI,BUFFER1MOV AX,0000HMOV CX,200CLDREP 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: NOPLOOPDEC BXJNE L2
暂停指令
- HLT
- 硬件退出不执行下面
- INTR加中断请求信号,如果响应中断,则保护现场
宏指令
- 用户自己开发的,先定义后使用
- 宏指令的定义
宏指令名 MACRO [形式参数1,形参2……]
……;宏体
ENDM
;定义一条宏指令,将某通用寄存器REG左/右移若干次
SHIFT MACRO REG,DIR,NMOV CL,NDIR REG,CL//S&DIR REG,ClENDM
-
宏调用
SHIFT AX,HL,3;(AX)逻辑左移3
SHIFT BL,AR,4;(BL)算数右移4 -
把宏体插入汇编,实参代替形参;汇编后左边带有加号
-
省时间,非空间
;定义一条宏指令,完成回车换行
CRLF MACROMOV AH,2MOV DL,0DHINT 21HMOV AH,2MOV DL,0AHINT 21H
ENDM
-
宏展开
-
避免标号重复
;数据块搬家
DATAMOV MACRO DATA1,DATA2,NLOCAL NEXT;NEXT是局部标号LEA SI,DATA1LEA DI,DATA2MOV CX,N
NEXT: MOV AL,[SI]MOV [DI],ALINC SIINC DILOOP NEXTENDM……DATAMOV buf1,buf2,100//汇编展开;NEXT---LOOP ??0000DATAMOV buf3,buf4,200//汇编展开;NEXT--->LOOP ??0001
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
