技术标签: 汇编
三总线:AB(address bus)地址总线、DB数据总线、CB控制总线
非压缩BCD——高位全0
ASCII码——先列后行
变补——即求[ – Y]补,所有位(包括符号位)按位取反,再加1
溢出——双高位判别法:
寄存器
通用寄存器
标志位寄存器F(9位有含义):
状态标志位
进位标志CF(carry flag):反映算术运算后是否出现进位或借位,有为1
辅助进位AF(assist flag),反应运算结果低4位是否向高位进位或借位
奇偶标志PF(parity flag),反应结果低8位中1的个数是否为偶数
零标志ZF(zero flag):当运算结果为0,ZF = 1
符号标志SF(sign flag):与运算结果最高位(符号位)保持一致,
溢出标志OF(overflow flag):有溢出则为1
控制标志位
方向标志DF(direction flag):控制串操作步进方向,为1则按地址递减(下–>上)进行,0按递增方向
中断允许标志IF(interrupt flag):允许中断为1,关闭中断为0
陷阱标志TF:为1执行一条指令则中断,调试程序时用
引脚
引脚功能:40个引脚分4部分:AB、DB、CB及其他(时钟和电源)
AB地址总线&DB数据总线
20条地址总线,对应1M内存,即220
在CPU和内存(或IO设备间传数据),是16位双向三态总线
引脚AD15到AD0为地址和数据分时复用线,找到地址后释放,变为数据总线
AD19到AD16/S6到S3为地址状态粉饰复用线
CB控制总线
存储器
分段管理:将内存20位地址分为64K 长度(对应段寄存器为16位)的24 = 16段管理,而当程序或数据量较大时,超过了64KB,那么可以定义多个代码段或数据段、堆栈段、附加段
物理地址——20位,逻辑地址——16位(段偏移量)
重要指针对:
规则字——高低位存在一对高低位库
堆栈——FIFO,暂存数据
IO资源
时钟与总线周期:
复位:大部分清零,只有CS寄存器FFFFH(故复位后,第一条指令放在FFFFH : 0000H)
寻址方式def:即逻辑地址EA生成PA物理地址的关系,操作数可位于寄存器、存储器或I/O端口中。
源操作数(src)和目的操作数(dst)应分别说明寻址方式
寻址方式
寻址方式小结:
立即数可以出现在方括号内,表示直接地址,如[2000H],类似指向2000H指针
只有BX、BP、SI、DI这四个寄存器可以出现在[ ]内,它 们可以单独出现,也可以几个寄存器组合,或以寄存器与 常数相加的形式出现,但BX和BP寄存器不允许出现在同一 个[ ]内,SI和DI也不能同时出现
由于方括号有相加的含义,下面几种写法都是等价的
例如DISP[BX] [SI] < = > EA = BX + SI + DISP
若方括号内包含BP,则隐含使用SS来提供基地址
其余情况均隐含用DS作基地址, 物理地址 PA=16×DS+EA
注意:计算EA时,相加的结果一定要按16位归算
IO注意:一方只能为PORT或DX,另一方只能为AL(8位)或AX(16位)
(3)寄存器寻址,相对基址变址寻址
(5)隐含寻址,固定寻址
CS不可作为目的操作数
两个段寄存器间不能直接传输数据
PUSHF
寄存器间接寻址不能用AX——[AX] 是×
注意操作数位数对应MOV AX, WORD PTR[SI]
IO端口只能用DX
注意事项:
R寄存器,SR段寄存器,M存储器,Im立即数
操作数的类型匹配(8/16位), 取决于R或者立即数 的位数
不允许在段R之间直接传送信息
CS和IP不能用作目的操作数,内容不能随便修改
通用传送指令——MOV
PUSH&POP
通用寄存器:PUSH AX
段寄存器:PUSH CS
存储器:PUSH [SI]
标志位:PUSHF/POPF
考点——堆栈实现轮转
累加器AX专用传送指令
地址目标传送——load EA/DS/ES
标志传送
加法:
减法:
不带错位:SUB——dst = dst -src
带错位:SBB
自减1:DEC
求变补:NEG——求相反数,用于求Im-M类型NEG AL&ADD AL,IM
比较指令:CMP,与SUB区别是只返回标志位
乘法:——隐含目的操作数为AX/DX+AX
除法类:隐含目的操作数为AX
无符号数:DIV src
有符号:IDIV src
结果超出AL/AX容量,产生0中断
除法运算后,AF、ZF、OF、SF、PF和CF都不确定(无意义)
带符号数扩展
对寄存器影响
u表示无意义,x表示影响
进位清零,溢出清零
AND dst,src —— dst ← dst∧src
OR dst,src
XOR dst,src
NOT src —— src = ~src
TEST dst,src ——只影响标志位,用于测试指定位是0还是1
移位类
SAL src,count 算术左移
SAR src,count算术右移
SHL src,count逻辑左移
SHR src,count逻辑右移
count = n 时,先MOV CL,n再移位,n<255
算术移位用于带符号数,逻辑移位用于无符号数
左移即 x 2两种无区别,低位补零
SAR符号位不变,SHR符号位补零,低位均是移到CF
循环移位(不补零类似循环队列)
唯一一类src与dst均在存储单元的指令
隐含:DS:SI指向源串首地址,ES:DI指向目的串首地址,若同段操作则——MOV ES,DS。移动后自动加减
CLD让DF=0则由低到高递增进行 ↓,STD让DF=1 ↑则由高到低串尾到串首
重复次数与CX有关
处理长度为64K,即CX=0FFFFH
三种重复前缀
REPE/REPZ与CMPS连用,判断字符串是否一致
REPNE/REPNZ与SCAS连用,判断字符串是否有AX/AL中的值
移动串MOVSB与MOVSW
取信息LODSB/LODSW——DS: SI取到AL/AX
存信息STOSB/STOSW——AL/AX信息存到ES: DI
比较串CMPSB/CMPSW——SI-DI只影响标志位
扫描串SCASB/SCASW ——AL/AX - ES:DI
范例
MOV AX,2000H
MOV DS,AX
MOV AX,3000H
MOV ES,AX
MOV SI,1500H
MOV DI,0200H
MOV CX,4
REP MOVSB
注:MOV AX,[2000H]指把存在2000H的数值赋给AX
JUM无条件转移:
CALL调用——产生断点去执行
CALL NEAR PTR B1
CALL FAR PTR B2
步骤
断点保护:段内调用IP入栈,段间调用CS入IP再入
CALL
RET 2/RET 4
条件转移
直接标志转移——标志位满足条件就转移
间接标志转移——标志位运算满足条件则转移
转移超限——针对条件转移
JZ ADDR1
;
ADDR1: JMP B1
;
B1: ;
JG AGAIN;超范围
NEXT:;
JLE NEXT
JMP AGAIN
循环指令
LOOP B1——次数取决于CX值
LOOPE/LOOPZ B1—— ZF=1&CX!=0跳转B1执行,ZF=0退出
LOOPNE/LOOPNZ B1——ZF=1退出
标志位控制指令
蓝色部分,需要背住
暂停指令——HLT
空操作——NOP
NOP空耗3个时钟周期
中断指令
保护断点CS:IP外还需要保护现场(F寄存器入栈)
调用格式:INT n(每级中断4个字节,共0~255占M最低03FF空间)
详解中断过程——以1号中断为例,必考
;关于中断空间存储的是啥
;1号中断对应4个字节0004,0005,0006,0007H
;要执行的中断程序IP存前两个,CS存后两个
;即IP存在0004H0005H
;CS存在0006H0007H
;起始位置 = 1 * 4 =0004H
;step1——F入栈,SP = SP-2, F→SP,SP+1
;step2——IF=0;TF=0关闭中断
;step3——原断点处CS入栈
;step4——原断点处IP入栈
;IP = {n*4+1,n*4}
;CS = {n*4+3,n*4+2}
内部专用中断—— n = 0~4
中断返回——IRET,弹出IP/CS/F
调用方法——MOV AH xx + INT 21H
重要考点
2号功能调用——显示一个字符
;显示数据给DL
MOV AH,02
MOV DL,24H;显示‘$’,DL赋值为ASCII码
INT 21H
9号功能调用——显示字符串
;显示字符串,DS:DX指向存放字符串ASCII码的连续内存的首地址
;连续内存最后有结束符号24H对应‘$’
;因此9号功能调用无法显示‘$’
;举例——显示字符串
STR1 DB “How are you?”,0DH,0AH,'$'
;0DH即回车CR,0AH即换行LF
;关键在于赋值DS:DX
MOV AH,9
MOV DX,SEG STR1
MOV DS,DX
MOV DX,OFFSET STR1
INT 21H
返回DOS功能——4CH,放在程序结尾处
;在每次调用完DOS后使用作为结尾
;举例
CODE SEGMENT
START:
MOV AH,2
MOV DL,'$'
INT 21H
MOV AH,4CH
INT 21H;返回DOS
CODE ENDS
ENDS START
分段——SEGMENT……ENDS
DATA SEGMENT PUBLIC 'DATA';注意此处类别名为单引号
;PUBLIC 指组合类型,表明本段与其他段关系
STR DB "Hello world",0DH,0AH,'$'
DATA ENDS
说明:字符串一般使用“……”
若使用‘……’,则无法显示‘’THIS is ‘a’.”这种含单引号的语句
段指示——ASSUME
ASSUME CS:CODE,DS:DATA,SS:STACK
定位伪指令ORG和 当前位置计数器$
ORG 2000H——设置段起始位置2000H
$ ——始终指向下一 个存储单元的偏移地址
常用格式——获取数组长度
STR1 DB .....
COUNT EQU $-STR1
程序结束指令END——标记汇编源程序结束,放在最后
CODE SEGMENT PUBLIC 'CODE'
START:
MOV AX,DATA
MOV DS,AX
CODE ENDS
DATA SEGMENT
ORG 3000H
STR DB 21H
DATA ENDS
END START
程序块定义——PROC….ENDP
;定义子程序块功能,通常配合CALL调用
ADD1 PROC FAR
MOV DX,1
ADD AX,DX
RET
ADD1 ENDP
.....
CALL FAR ADD1;此处要与定义时的属性FAR对应
程序块通信——PUBLIC/EXTRN
EXTRN ADD2:FAR,ADD3:FAR;声明本模块中要引用外部ADD2,ADD3模块
ADD1 PROC FAR
PUBLIC ADD1;声明可以被其他模块访问
....
ADD1 ENDP
算术——+,-,*,/,MOD,SHL( *=2),SHR( /=2)
逻辑——AND/OR/XOR/NOT
关系——EQ,NE/LT(less than)、GT(large than)/LE(less and equal)、GE
SEG ——求段基址,SEG STR = DS
OFFSET——求偏移量
;运算符完成是在汇编之前,即在MASM.exe转为.obj文件前
MOV BX,OFFSET STR1 <=> MOV BX,2;汇编结果
;相当于
LEA BX,VAR2
TYPE——求类型
LENGTH——求变量数
N1 DW 10 DUP(0)
MOV AL,LENGTH N1;AL=10
SIZE—— SIZE = LENGTH * TYPE
PTR——生成一个新的存储器地址操作数,指向给出的地址
VAR1 DW 2030H
VAR2 EQU PTR VAR1
;此时VAR2与VAR2均指向2030H,但 TYPE VAR2=1
;给出类型可为BYTE/WORD/DWORD/NEAR/FAR
SHORT——修饰JMP指令中转移地址的属性,JMP SHORT TAG
THIS——类似PTR,区别是不实际分配新的存储单元,定义空指针NULL
VAR3 EQU THIS BYTE
数据定义:
定义结构体
宏指令MACRO……ENDM
def:重复出现的一组语句可定义成“宏指令”
适合语句少的片段,多的要用子程序调用PROC
;定义宏指令
ADD1 MACRO X,Y,Z;形参
MOV CL,X
S&Z Y,CL;此处&为分隔符,该宏指令Z若为AL,此处快捷写法等价于SAL
ENDM
;调用宏指令
ADD1 4,AL,AL;AL算术左移4次
ADD1 6,BX,HR;BX逻辑右移6次
基本结构:顺序、简单分支、多分支、DO-WHILE、DO-UNTILE
RAM随机存储器
典型SRAM芯片
数据线相同,均处理8位数据,只是地址线即存储容量不同
只读存储器ROM
存储器真实模式 —— 高字库(奇地址),低字库(偶地址)
位数扩展
def:CPU单元位数 > 存储器芯片的位数,例如8086的16位>6264的8位
解决方法——芯片并联法
~IO/M = 1对存储器操作,加反相器使得~CE满足,芯片工作
小结:
字数扩展(存储容量)
线选法 —— 剩下的高位不需要译码器直接连~CE n
存在问题及特点
全地址译码法 —— 高位接译码器后再接~CE
译码结果:
A15A14用于芯片片选
特点:
部分译码法——介于线选法与全译码法之间
奇偶分体电路——高奇低偶
A0=0对应偶地址,A1=0对应奇地址
存储器与8088CPU连接
STEP1——画表
STEP2——设计译码电路
仍存在地址重叠,修正如下:
CBA(A是低位)改接A19A17A15
同时增加A17A16异或,保证CBA=111时A19~A15全1
STEP3——连接
8086系统存储器——奇偶分体
A0=0偶地址选低位库,A0(#BHE)=1奇地址选高位库
同时高地址线用于片选
三要素:中断源:(内部、外部)、断点、中断服务程序
中断处理过程: 中断申请 -> 中断响应 -> 中断服务程序 -> 中断返回
中断向量表
中断优先级
3个独立并行输入/输处端口
各个端口均具有数据的控制和锁存能力
与系统连接的引线
对于A1A0 = 00A端口,01B端口,10C端口,11控制寄存器
与外部设备连接的引线
工作方式
方式0——三个独立8位简单接口
可设置位输入或输出口,但不能同时实现输入及输出
C口可拆分
用于无条件或查询方式
方式0习惯应用:
A/B用于数据输入或输出
C某些位用于状态输入,内部4位之间不能同时实现输入及输出
控制字
方式控制字
位控制字
82C55应用
电路连接图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EKDV5aWf-1677120618204)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7266d0fbb1e441729b0b4dc5d1a70d2a.png#pic_center)
PB7=1表示启动监控
PA0~PA7表示监控状态
PC0设置输出报警:高电平——延迟——低电平
具体编程
;初始化程序
;CTRL EQU 1023H
;1020H--A,1021H--B,1022H--C,1023H--CTRL
MOV DX,1023H;控制字地址
MOV AL,10010000B;设置方式,A方式0输入,B方式0输出,C0输出
OUT DX,AL
MOV AL,0;设置PC0=0
OUT DX,AL
;启动监控
MOV DX,1021H;选B
MOV AL,80H;PB7输出高电平,启动
OUT DX,AL;输出到B口
;循环获取A端口状态
A:
MOV DX,1020H;选A口
IN AL,DX;读取A口状态
CMP AL,0;建议是否有1,即出现异常
JZ A;有异常1则退出循环
;启动警报
MOV CX,10
MOV DX,1022H
MOV AL,1
B:
OUT DX,AL
CALL DEALY
NOT AL
CALL DEALY
LOOP B
工作特点
主要引脚
内部结构
计数启动方式:
共6种工作方式
方式0——软件启动,不重复计数
开始时输出低电平,结束高电平
先给端口地址,接着再给计数初值
方式1——硬件启动,不重复计数
方式2——软硬件启动,自动重复计数,
计数器初始状态不定,故第一个周期一般多了一个脉冲
N=2或3可用作二分频器
方式3——软硬件启动,自动重复计数
N为偶数输出对称方波,故又称方波发生器
等价于分频器,N为计数时正脉冲多一个即(N+1)/2
方式4——软件启动,不自动重复计数
方式5——硬件启动,不自动重复计数
控制字详解
最大16位BCD计数值9999,最大16位二进制最大计数值FFFF
两种最大值对应存在内部16位寄存器的形式都是10000
8253应用
硬件连接
初始化——控制字,初值
8253简单应用举例:
分析:
CNT0要求重复输出一个CLK的负脉冲,对应方式2
CNT1要求输出方波,对应方式3
CNT2要求定时后输出高电平,对应方式0或1
step1——确定初值与工作方式
'''
T = 1/f = 0.5us
CNT0: 10ms/0.5us = 20000
CNT1: 2MHz/10Khz = 200
CNT2: 5ms/0.5us = 10000
'''
step2——确定控制字
'''
CNT0:方式2,初值>255故16位计数————00110100
CNT1:方式3,初值<255故8位计数————01010110
CNT2:方式0,初值>255故16位计数————10110000
'''
step3——硬件连接(由于无要求故选择软启动)
step4——编写初始化程序
;先写初值写入,再写计数初值
CNT0:
MOV DX,0123H;控制字端口
MOV AL,34H
OUT DX,AL;送控制字
MOV DX,0120H;CNT0端口
MOV AX,20000
OUT DX,AL;先送低八位,再送高八位
MOV AL,AH;此处需注意,OUT只能使用AL
OUT DX,AL
CNT1:.....
CNT2:....
对于方式2和3.当GATE=0时停止计数,上升沿时清零重新计数
初始化方法2:初始化控制字,CNT0初值/CNT1初值/CNT2初值
8253简单应用举例:
分析:
CNT0要求重复输出一个CLK的负脉冲,对应方式2
CNT1要求输出方波,对应方式3
CNT2要求定时后输出高电平,对应方式0或1
step1——确定初值与工作方式
'''
T = 1/f = 0.5us
CNT0: 10ms/0.5us = 20000
CNT1: 2MHz/10Khz = 200
CNT2: 5ms/0.5us = 10000
'''
step2——确定控制字
'''
CNT0:方式2,初值>255故16位计数————00110100
CNT1:方式3,初值<255故8位计数————01010110
CNT2:方式0,初值>255故16位计数————10110000
'''
step3——硬件连接(由于无要求故选择软启动)
step4——编写初始化程序
;先写初值写入,再写计数初值
CNT0:
MOV DX,0123H;控制字端口
MOV AL,34H
OUT DX,AL;送控制字
MOV DX,0120H;CNT0端口
MOV AX,20000
OUT DX,AL;先送低八位,再送高八位
MOV AL,AH;此处需注意,OUT只能使用AL
OUT DX,AL
CNT1:.....
CNT2:....
对于方式2和3.当GATE=0时停止计数,上升沿时清零重新计数
文章浏览阅读6.7k次,点赞2次,收藏3次。Gerrit可以实现在线代码Review的功能,与GitLab的merge request功能相当。目前想在Gerrit的基础上增加静态代码扫描的功能,以进一步提升代码质量。网上搜到的技术方案是:Gerrit + Jenkins + Gerrit Trigger。一句话概括就是:在Jenkins上创建一个代码检查的工程,通过pom文件方式配置号第三方的静态代码扫描工具;Jenkins通过Gerri..._keys/rsa_2048_pub.key' does not exist
文章浏览阅读1w次,点赞4次,收藏13次。post请求有两种传递参数的方法,一种是通过在url后面使用问号(?)将参数拼接的方式传递。另一种是通过data传递参数。get请求只能通过url传递参数,post请求既可以通过url传递参数,也可以通过data(body体)传递参数。可以参考文章:https://www.zhihu.com/question/64312188以下所有实例都是传递三个参数:title、content、typeid。示例通过两种方式请求后端接口,分别用ajax请求和接口测试工具apipost请求。第一种_webapi 获取post请求body中的数据
文章浏览阅读2.9w次,点赞5次,收藏15次。原贴地址:http://bbs.pcbeta.com/viewthread-1763144-1-1.html1、安装驱动前。先对clover的config.plist进行设置。CsrActiveConfig由0x3改成0x0。如下图所示。[img]blob:http://bbs.pcbeta.com/43219d6d-00b1-4256-8c09-1991dc03794c[/img]2、Sy..._装驱动后黑屏怎么删除驱动
文章浏览阅读7.3k次,点赞2次,收藏10次。和C++一样,Python中函数的定义必须在调用的前面,但是在函数的内部调用一个函数,不用考虑函数的顺序,只要被调用的函数被定义了即可1.先定义后,后调用为一般方法:def add_test(a,b): return a+breslut = add_test(1,2)print(result)2.可以在函数内部调用后面的函数def add_1(a,b): return add_2(a,b) #函数内部调用add_2def add_2(..._python 数学函数 调用
文章浏览阅读861次。在线 YAML 转 Properties 网站_yaml转properties在线
文章浏览阅读364次。1.WebMagicWebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。2.在Eclipse中配置WebMagic1.首先需要下载WebMagic的压缩包官网地址为:WebMagic官网最新版本为:WebMagic-0.7.3,找到对应版本,打开下载界面,注意,下载要选择Source code(zip)版本,随便下载到哪里都可以;2.下载好的压缩包需要解压,此时解压到的位置即为后续新建的Eclipse的project位置,比如我的Ecli_使用eclipse搭建webmagic工程
文章浏览阅读3.9k次。MySQL如何更改数据库名字_mysql update数据库名称
文章浏览阅读9w次,点赞24次,收藏65次。windows上最好用的文件管理软件 Directory Opuswindows 自带的文件管理软件就不用提了,垃圾的一比。而市面上比较流行的文件管理软件 xyploer,total commander 之类我都使用过,其中 total commander 的确是神器,但是界面太难看,还有学习路径比较陡峭,最后还是放弃了。后来我使用了 windows 上的资源管理器增强软件 clover 感觉..._directory ops
文章浏览阅读212次。1.1AWT容器1.1.1Window和FrameWindow独立存在不依赖于任何其他容器。Window有两个子类:Frame和Dialog。一、窗体Frame:带有标题,而且可以调整大小。1.Frame的构造方法: 1). Frame() 构造的新实例 Frame初始时不可见。 2). Frame(GraphicsConfiguration gc) 构造一个新的,最初看不见的 F..._awt容器定义
文章浏览阅读656次,点赞24次,收藏12次。包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
文章浏览阅读175次。Spring Cloud Alibaba 介绍Sping体系Spring 以 Bean(对象) 为中心,提供 IOC、AOP 等功能。Spring Boot 以 Application(应用) 为中心,提供自动配置、监控等功能。Spring Cloud 以 Service(服务) 为中心,提供服务的注册与发现、服务的调用与负载均衡等功能。Sping Cloud介绍官方介绍 Tools for building common patterns in distributed systems_sprngcloud alba
文章浏览阅读3.2k次,点赞4次,收藏21次。我这里是根据之前在测试数据类项目过程中的一些总结经验和掉过个坑,记录一下,可以给其他人做个参考,没什么高深的东西,但是如果不注意这些细节点,后期也许会陷入无尽的扯皮当中。1 需求实现的准确度根据产品需求文档描述发现不明确不详细的或者存在歧义的地方一定要确认,例如数据表中的一些字段,与开发和产品确认一遍,如有第三方相关的,要和第三方确认,数据类项目需要的是细心,哪怕数据库中的一个字段如果没有提前对清楚,后期再重新补充,会投入更大的精力。2 数据的合理性根据业务场景/常识推理,提..._基础字段的测试点