欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

微机原理与接口技术--西安电子科技大学-笔记三

程序员文章站 2022-05-13 23:53:05
...

前言

笔记三已经更到第四章了,第四章剩下的就是例程讲解了,在此吹爆周老师的课。

例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

子程序调用与返回指令&&子程序的设计技术

子程序的概念

  1. 类似于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
  1. (IP)---->SP-2;字单元
  2. 当前IP+DISP;DISP==当前IP到目标地址差
  3. 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
  1. 使用堆栈进行现场保护
  2. (CS)—>SP-2;(IP)---->SP-2;
  3. SET SUB1—>CS;OFFSET SUB1---->IP
  4. RET ;以SP为栈顶地址,弹出给IP----SP+2再弹出CS;SP+2—恢复
  5. 如果子程序的实体破环了SP,一定要恢复SP,PUSH和POP一定要配对

信息的保护与恢复

  1. 在调用子程序时要把数据入栈,保护数据
  2. 在返回后出栈进行数据恢复
  3. 一般在子程序中进行

主程序与子程序之间的参数的传递方法

  1. 入口参数—出口参数
  2. 采用寄存器传递–太少
  3. 存储器单元在数据段定义MEM,call之前记到MEM,子程序调用读取
  4. 堆栈区也可以传递,注意SP的变化

子程序说明文件

  1. ;开头
  2. ;子程序名
  3. ;子程序的功能
  4. ;入口参数
  5. ;出口参数
  6. ;所使用的寄存器和存储单元
  7. ;举例(略)

子程序允许嵌套

  1. 嵌套时注意堆栈溢出

子程序递归

子程序可再用

  1. 中断请求—执行完中断服务子程序

例程–例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;
  1. 注意SP的变化以及恢复SP,RET 4;带参数的返回

中断调用与返回指令以及第八章知识点

中断定义

中断源定义

  1. CPU内部和外部
  2. 内部

除法错(N=0)、单步中断(TF = 1)(N=1)、断点中断(INT 3)(N=3)、INTO 溢出中断(OF)(N=4)、INT n(N=n)
为了识别中断源,给每个中断源编排了中断类型号(0-255)

  1. 外部

NMT–非可屏蔽 (N=2)\上升沿\不受IF的控制
INTR–受IF中断标志位控制\高电平有效\N不固定\在8086扩展一个中断控制器(8259A),8个请求中断段连接8个中断源,通过INT向INTR请求,中断控制器可以通过数据线与CPU连接,可以初始化,配置中断控制器,配置R0的N就可,其余的依次

中断类型号

中断向量

  1. 在响应中断请求时,先执行完当前指令,保护中断现场(CS:IP\PSW)。IP\CS\PSW–>依次压栈保护
  2. 就是中断服务子程序的入口地址(32 段地址:偏移地址)

中断向量表

  1. 1K—存放中断向量表----4个单元—一个中断向量
  2. 已知N,在中断向量表找到中断子程序的入口地址—N4----N4(IP):N+2(CS)
  3. IRET----中断返回

中断响应过程

  1. 内部和不可屏蔽:保护现场—P71
  2. 可屏蔽:要用过^INTA发送一个低脉冲告诉中断控制器响应,第二是问N,通过数据线读取

系统调用

  1. 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
;视觉残存

  1. 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)

  1. 数据块(字符串)
  2. 源、目的字符串

特点

  1. 源与目的串的寻址方式都是隐含寻址
    • 如果源串在存储器中,则存储器的的地址在DS:SI;若在REG中字节:AL,字:AX
    • 目的串,必须在ES:DI;在REG同上
  2. CPU执行后,SI、DI的地址会自动改变,受DF的控制,DF=0,+;DF=1,-;±的数量受操作类型的控制
  3. 在串操作指令的左边可以增加重复前缀,重复次数在CX中

串传送指令 (REP) MOVSB/MOVSW

  1. MOVSB/MOVSW/
  2. MOVSB

(ES:DI) < ---- (DS:SI)
(SI)±1—>SI;(DI)±1—>DI
(CX)-1—>CX;若CX != 0;重复执行

  1. MOVS DST,SRC;根据操作数的类型进行编译;保证类型一致
  2. 例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
  1. 若源数据块和目的数据块重叠,从末尾开始;CMP SI,DI

串比较指令 (REPE/REPZ)(REPNE/REPNZ) CMPSB/CMPSW–影响标志

  1. CMPSB/CMPSW/CMPS DST,SRC
  2. CMPSW

(SRC)-(DST)—(DS:SI)-(ES:DI);根据差的结果设置6个状态位,ZF
(SI)(DI)±2;
REPZ CMPSW ;(CX)-1–>CX;若CX != 0&&ZF==1;重复执行

  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–影响标志

  1. SCASB/SCASW/SCAS DST
  2. REPNZ SCASB

(AL)-(ES:DI);设置六个状态标志位ZF,存储区在目的
DI±1—>DI;
(CX)-1—>CX,若CX != 0&&ZF==0,没找到,重复执行
找到后ZF = 1,在DI-1中

串装入指令 (REP) LODSB/LODSW

  1. LODSB/LODSW
  2. LODSB

DST:AL; SRC:DS:SI
(DS:SI)—>AL
(SI)±1—>SI
在串口接收端口有缓存区SBUF,一个LOD,一个STO

串存贮指令 (REP) STOSB/STOSW

  1. STOSB/STOSW
  2. STOB

AL—>(ES:DI)
DI±1

  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
  1. 例4.7

输入输出指令

输入指令

  1. IN DST,SRC;SRC—>端口地址(0-65533,64K)

0-255;直接寻址;IN AX,端口地址
255;MOV DX,端口地址;IN AX,DX
相邻的两个8位—>字单元

输出指令

  1. OUT DST,SRC;DST:AX/AL;SRC:IO地址
  2. 输入输出指令工作时间要多一个周期(5个周期)—>总线周期—>T1\T2\T3\TW(等待)\T4

其他指令

空操作

  1. NOP—3个周期
  2. 延时子程序
    MOV BX,
L2: MOV CX,0;65536
L1: NOP
    LOOP
	DEC BX
	JNE L2

暂停指令

  1. HLT
  2. 硬件退出不执行下面
  3. INTR加中断请求信号,如果响应中断,则保护现场

宏指令

  1. 用户自己开发的,先定义后使用
  2. 宏指令的定义

宏指令名 MACRO [形式参数1,形参2……]
……;宏体
ENDM

;定义一条宏指令,将某通用寄存器REG左/右移若干次
SHIFT MACRO REG,DIR,N
      MOV CL,N
	  DIR REG,CL//S&DIR REG,Cl
      ENDM
    
  1. 宏调用
    SHIFT AX,HL,3;(AX)逻辑左移3
    SHIFT BL,AR,4;(BL)算数右移4

  2. 把宏体插入汇编,实参代替形参;汇编后左边带有加号

  3. 省时间,非空间

;定义一条宏指令,完成回车换行
CRLF MACRO
     MOV AH,2
	 MOV DL,0DH
	 INT 21H
	 MOV AH,2
	 MOV DL,0AH
	 INT 21H
ENDM
  1. 宏展开

  2. 避免标号重复

;数据块搬家
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
相关标签: 专业学习笔记