(完整版)8086汇编语言速成秘籍
(完整版)8086汇编经典例程,推荐文档
sub bl,26 mov al,'a' add al,bl
MOV CX,00H WAIT1: LOOP WAIT1
;延时计数器 ;延时
DW 2 DUP (25*8,25*8,50*8) DW 12 DUP (25*8),100*8
jmp next40
DEC DX
next24: sub bl,52
==========================================
MAIN ENDP
MOV AX,[SI]
5. 编写一个数组排序(从小到大)的小程序,数组在程
序中定义,程序先将原数组显示一遍,然后排序,再
DISP PROC
将排好序的数组显示一遍。
PUSH SI
==========================================
MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100 DW 2 DUP(50,50,25,25),100 DW 3 DUP(50,25,25),100
crlf proc push ax push dx
音演奏歌曲 ========================================== ;这是一个音乐程序,按大写字母“A”,唱乐曲“玛丽
ccc segment assume cs:ccc,ds:qqq
main proc far start: mov ax,qqq
mov ds,ax
next3:
jmp next10 cmp al,'a' jnae next4 cmp al,'z' ja next4 sub al,'a'
(完整word版)汇编语言指令集合-吐血整理,推荐文档
8086/8088指令系统记忆表数据寄存器分为:AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.BH&BL=BX(base):基址寄存器,常用于地址索引;CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.DH&DL=DX(data):数据寄存器,常用于数据传递。
他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。
这2组8位寄存器可以分别寻址,并单独使用。
另一组是指针寄存器和变址寄存器,包括:SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置;BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。
指令指针IP(Instruction Pointer)标志寄存器FR(Flag Register)OF(overflow flag)DF(direction flag)CF(carrier flag)PF(parity flag)AF(auxiliary flag)ZF(zero flag)SF(sign flag)IF(interrupt flag)TF(trap flag)段寄存器(Segment Register)为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。
8086汇编指令大全.
不允许寄存器或存储单元到除CS外的段寄存器
2入栈(出栈指令PUSH (POP
注意:
PUSH操作数不能是“立即数” POP操作数不能是段寄存器
CS
不影响标志位
先进后出
单操作符
3交换指令XCHG
注意:
只允许寄存器与存储单元之间的交换
不影响标志位
4换码指令XLAT
5地址传送指令LEA :偏移地址
ZF=0
SF符号标志位
OF溢出标志位
DF方向标志位
IF中断允许位IF=1时响应外部中断
TF跟踪标志位
操作数:[目的操作数(OPD ,源操作数(OPS ] ;立即操作数,寄存器操作数,存储器操作数。寻址方式:
1寄存器寻址例:INC AX ; MOV AX , BX
2寄存器间接寻址(寄存器只能是BX , DI , SI , BP ; [PA=(BX、DI、SI +DS》4或BP+SS》4]
6数据段指针送寄存器LDS :低地址的字送指定的通用寄存器(SI、高地址的字
送DS
7附加段指针送寄存器指令LES :与LDS相似,低地址的字送通用寄存器(DI、高
地址送ES
上三指令不影响标志位
8标志寄存器传送指令
LAHF :标志寄存器低八位送
AH
SAHF :AH送标志寄存器低八位
PUSHF :标志寄存器压入堆栈
标志寄存器:9个有效位,分6个状态寄存器和3个控制寄存器
CF当执行一个加法(减法使最高位产生进位(借位时CF=1否则
CF=0
PF指令执行的结果低8位有偶数个一时, CF=1否则
CF=0
AF当执行一个加法(减法使运算结果低4位向高4位有进位(借位时AF=1否则
第三章 8086指令系统及汇编语言
例:已知:(DS)=2100H,(DI)=2000H 指令:MOV AX,[DI];(AX) ((DI)) 物理地址=(DS)×16 +(DI)
=2100H ×16 + 2000H =21000H+2000H =23000H 指令结果:将23000H单元内容送AL中,
将23001H单元内容送AH中。 指令:MOV AX,[DI] 为字操作(16位操作)
32000
AH AL
注意:程序(指令) 在代码段,要操作 的数据在堆栈段!
图3-4(B) 寄存器间接寻址
5、 寄存器相对寻址方式
例:MOV AX,[SI];SI中的内容为要取数的偏移 地址,假设在执行本条指令前SI=1000H,DS=2000H
其过程如图3-4(a)所示。
代码段
..
注意:程序(指令在 代码段),要操作的 数据在数据段!
操作码 数据段
DS 2000 + SI 1000
21000
.. .. ..
21000H X X 21001H Y Y
例:已知:(DS)=2100H,(DI)=2000H 指令: MOV AL,[DI] ;(AL) ((DI))
物理地址=(DS)×16+(DI) =2100H×16+2000H =21000H+2000H =23000H
指令结果:将23000H单元内容送AL中, 指令: MOV AL,[DI];字节操作(8位操作)
数据段
字寻址方式
AH=F5 AL=8A 字寻址方式
图3-3 直接寻址
3、寄存器寻址方式 格式:操作码 寄存器,寄存器
MOV AX, BX
;AX←BX
操作数存放在CPU的内部寄存器reg中 1)8 位寄存器r8: AH、AL、BH、BL、CH、CL、DH、DL 2)16 位寄存器r16: AX、BX、CX、DX、SI、DI、BP、SP 3)4个段寄存器seg: CS、DS、SS、ES
8086的汇编超级浓缩教程
“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。
”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。
)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。
三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%& “醒醒!”对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。
所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。
某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。
为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。
但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。
大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解)因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提)CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。
第三讲8086汇编语言
XCHG BH, BL ;√ XCHG AX, 1122H ;× XCHG DS, AX ;× XCHG [SI], BP ;√ XCHG [SI], [DI] ;×
4
3.3 常用汇编指令
D S: 2000H 01H
2001H 02H
CF为前面指令产生的CF
❖格式:ADC DET ,SRC
❖功能:(DST)+(SRC) +CF DST ;
❖要求:同ADD
通用Regs ±
❖ADC指令主要用于多字节加法运算
IMM 通用Regs
MEM
❖ 例:两个32位数相加
0123FAB5H+0ABC212AH=0BE01BDFH 0123 FAB5
;√
MOV 2000H, AX
; × 目的不能为立即数
MOV DS:2000H, AX ; √
3
3.3 常用汇编指令
一、数据传送类指令
2.数据交换指令
❖格式: XCHG DST ,SRC ❖功能:将源 (SRC)和目的(DST)内容互换;
操作结果不影响F标志位。 ❖要求:只在两个通用Regs之间、通用Regs 和MEM之间互
❖ 说明:LEA的源操作数寻址方式为立即数寻址;
LDS、LES的源操作数寻址方式为存储器寻址。
❖例2:设 D S : 1 0 0 0 H 1 0 H 执行: MOV BX, 1000H
1001H 00H
LDS SI, [BX] ;间接寻址
1 0 0 2 H D 2 H 后, NhomakorabeaX=1000H
1003H 13H
➢操作数类型明确,不能出现二义性(即不能模糊)。
8086汇编语言指令表(按字母顺序)
2. 示例: (AL)=18H,(BL)=06H
ADD AL,BL ; (AL)<--(AL)+(BL) ; (AL)=1EH
DAA ; (AL)
DAS
组合十进制减法调整指令 DAS(Decimal Adjust for Subtraction)
则(AL)<--(AL)-6,(AH)<--(AH)-1,CF<--AF,(AL)<--(AL) and 0FH,
否则(AL)<--(AL) and 0FH
ADC
带进位加法指令 ADC(Addition Carry)
格式: ADC OPRD1,OPRD2
功能: OPRD1<--OPRD1 + OPRD2 + CF
DAA
组合的十进制加法调整指令 DAA(Decimal Adjust for Addition)
格式: DAA
功能: 对AL中的两个组合进制数相加的结果进行调整,调整结果仍放在AL中,进位标志放在CF中.
说明:
1. 调整操作如下
(1) 若(AL) and 0FH>9 或 AF=1,则(AL)<--(AL)+6,AF<--1,对低四位的调整.
格式: DAS
功能: 对两个组合十进制数相减后存于AL中的结果进行调整,调整后产生一个组合的十进制数且仍存于AL中.
说明:
调整操作
若(AL) and 0FH > 9 或 AF=1,则(AL)<--(AL)-6,AF=1
若(AL) and 0F0H > 90H 或 CF=1,则(AL)<--(AL)-60,CF=1
汇编语言速成秘籍
mem, reg
reg, mem
reg, reg
reg, imm
mem, imm
16+EA
9+EA
3
4
17+EA
2 ~ 4
2 ~ 4
2
3 ~ 4
3 ~ 6
操作数类型:
无符号二进制数,
带符号位二进制数,
无符号压缩BCD数,
无符号非压缩BCD数。
dest与src不能同时为内存操作数。
118 ~ 133
(124~139)+EA
2
2 ~ 4
2
2 ~ 4
不能是压缩的BCD数
不能是立即数
仅影响标志位OF\CF
IMUL src
Src为字节:(AX)←(AL) * (src)
Src为字:(DX, AX)←(AX) * (src)
8位reg
8位mem
16位reg
16位mem
80~ 98
(86 ~ 104)+EA
AX字节,AL字,DX不是操作数而是地址
10
2
直接寻址,port地址范围
0-255(0ffh)
OUT port,AL/AX
(port)←(acc)
10
2
INAL/AX,DX
(acc)←((DX))
8
1
间接寻址,端口地址在DX中,范围0-65535(0ffffh)
OUT port,DX
((DX))←(acc)
8
1
地址传送指令(对逻辑地址操作)
LEA reg, src取
有效地址指令
r16←mem的EA
(汇编语言教程)5_80868088汇编语言-2
104H DUP(11H 104H DUP(11H)
DUP( DUP(0)
ENDS
ENDS DATA2 DATA2 SEGMENT PARA DB COMMON ‘DATA2’ DATA2 DATA N2 DATA2 DATA2 105H DUP( 105H DUP(0)
DATA2 DATA2 N1 DATA2 DATA2 END
默认值为: 默认值为:PARA
III、 III、组合类型
段名 SEGMENT [定位类型] [组合类型] [使用类型] [‘类别’] 定位类型] 组合类型] 使用类型] [‘类别 类别’ …… …… ; 语句序列 段名 ENDS
PRIVATE:私有段,不进行组合。 PUBLIC:
– 不同模块中的同为public属性的同名段连接组合成一个逻辑段。
3、过程定义伪指令
格式: 格式:过程名 [类型 类型] PROC [类型] … 过程体语句 RET 段名 ENDP PROC和ENDP是成对出现的 是成对出现的。 PROC和ENDP是成对出现的。 类型有近(NEAR)和远(FAR)两种, 类型有近(NEAR)和远(FAR)两种,若过程缺省 NEAR缺省 则属默认值。若为远过程, FAR不 缺省, 或NEAR缺省,则属默认值。若为远过程,则FAR不 能省略。 能省略。 过程名具有段地址、 过程名具有段地址、段内偏移量和类型三个属 性。
2、源程序开始和结束伪指令
程序开始伪指令
– NAME伪指令 NAME伪指令 – TITLE伪指令 TITLE伪指令
程序结束伪指令
– END
(1)程序开始伪指令NAME 程序开始伪指令NAME
NAME伪指令 NAME伪指令 格式: 格式:NAME 模块名 含义:表示一个模块的开始, 含义:表示一个模块的开始,并给出该模 块名。 块名。
8086汇编语言学习(六)8086处理结构化数据(模拟高级语言结构体、数组)
8086汇编语⾔学习(六)8086处理结构化数据(模拟⾼级语⾔结构体、数组)⼀、8086汇编定义数据 要处理结构化数据,必须先定义数据。
8086汇编作为⼀门编程语⾔,定义数据的⽅式⽐起复杂的⾼级语⾔要简单不少。
汇编语⾔贴近机器底层,所处理的数据逻辑上都可以视为⼆进制数据,按照对不同⼤⼩内存单元的处理,分为三种:db、dw、dd。
1.db db 即define byte,定义⼀个字节变量。
例如 db 1h,代表着db指令后的值占⽤⼀个字节的内存空间 1h=>01h。
特别的,使⽤db可以⽐较简单的定义字符串数据,例如db "ABC",代表着定义A、B、C三个连续的字符。
2.dw db 即define word,定义⼀个字变量。
例如 dw 1h,代表着dw指令后的值占⽤⼀个字/两个字节的内存空间 1h=>0001h。
3.dd dd 即define doubleword,定义⼀个双字变量。
例如 dd 1h,代表着dw指令后的值占⽤两个字/四个字节的内存空间 1h=>0000 0001h。
在连续定义数据时,可以通过逗号进⾏缩写。
例如 db 1h,2h,3h等价与db 1h;db 2h;db 3h。
同时上述三种⽅式都可以与dup关键字(duplicate)使⽤。
例如,定义3个值为1h的字形数据,可以写为dw 3 dup(1h),其等价于dw1h,1h,1h。
在定义复数个相同的数据时,可以简化程序,增强可读性。
db、dw、dd、dup都属于8086汇编的伪指令,由汇编器在编译时进⾏处理,并没有对应的机器指令。
⼆、8086汇编处理结构化数据 之前介绍了8086各种不同⽅式的内存寻址⽅式,下⾯介绍8086如何利⽤这些多样的寻址⽅式来处理结构化的数据。
举⼀个简单的例⼦,假设存在⼀个结构化的数据(公司),拥有五个属性。
公司属性: 公司名称: BLZ 总裁名称: Deckard Cain 公司排名: 15 年收⼊(亿元): 50 产品: WOW 需求是,在内存中定义该数据并且对其中的部分属性进⾏修改,将公司排名修改为10,年收⼊修改为80,产品名称修改为OWO。
迅速掌握8088_8086指令系统的教学方法
业出版社, (@@6 晓 尤 编 译; 面 向 对 象 的 建 模 、 设计技术与方法; 北 2 王博, 京: 希望电脑公司, (@@2 柴 跃 延 编 译; 计 算 机 软 件 新 技 术—面 向 对 象 的 ’ 李芳芸, 系 统 分 析; 北 京 : 清华大学出版社, (@@2
;$’( <&$=&’( >?3*2$%* @#AB+2, 3BCD EFEGH EHGDGIJD F KGJBLM LN OPCQR SHFDECIS FDDGKTUV UFISPFSG CIDJHPQJCLI DGJ%WBCQB JL DLKG GXJGIJ BGUED DJPMGIJD DJPMV FDDGKTUV UFISPFSG MGDCSIY ,DDGKTUV 2FISPFSG !"!!#!"!$ <IDJHPQJCLI 9GJ ’EGHFIM
布局当前的查看界面。另外, 我 们 还 可 修 改 工 具 栏 底 图 === 在 E+^_$PNHPGF [JUIM_.+& ,]MCIFM_.+&,IIE 系 统 文 件 夹 下 找 到 9NNU<GP=<GTLHPNBKS;‘DH 文 件( (2Aa(2A , 用你自 256 色 ), 己的图替换它即可。
)#* +,-./ )#* &,-("""0 )#* 教学过程中,我先讲指令系统的统一格式和 基本规则, 然后再讲具体指令。 这时我只需讲操作码和特殊 的规则,节约不少课时。学生也觉得指令系统不是那么难 记。 在运用指令编写程序过程中, 学生记得用规则来验证指 令的正确性,避免犯无谓的错误。通过多年的教学实践来 看, 我觉得这是教授指令的好方法。 参 考 文 献 清 ( 沈 美 明 等 编 著 ; 7<)=$+ 汇 编 语 言 程 序 设 计 >)?; 北 京 : 华大学出版社, (@@2 中央 2 李 兆 凤 编 ; A"AA:A"A6 汇 编 语 言 程 序 设 计 >)?; 北 京 : 广播电视大学出版社, (@@’ 清华大 ’ 周 明 德 ; 微 型 计 算 机 系 统 原 理 及 应 用 >)?; 北 京 : 学出版社, (@@A 华南理工大学, ! 许 骏 ; 计 算 机 系 统 原 理 及 应 用 >)?; 广 州 :
8086汇编指令大全
8086汇编指令大全标志寄存器: 9个有效位,分6个状态寄存器和3个控制寄存器CF 当执行一个加法(减法)使最高位产生进位(借位)时CF=1 否则CF=0PF 指令执行的结果低8位有偶数个一时,CF=1 否则CF=0AF 当执行一个加法(减法)使运算结果低4位向高4位有进位(借位)时AF=1 否则 AF+0ZF 当前运算结果为零,ZF=1 否则ZF=0SF 符号标志位OF 溢出标志位DF 方向标志位IF 中断允许位 IF=1时响应外部中断TF 跟踪标志位操作数:[目的操作数(OPD),源操作数(OPS)] ;立即操作数,寄存器操作数,存储器操作数。
寻址方式:1) 寄存器寻址例: INC AX; MOV AX,BX2) 寄存器间接寻址(寄存器只能是BX,DI,SI,BP);[PA=(BX、DI、SI)+DS》4)或BP+SS》4]3) 寄存器相对寻址4) 基址变址寻址5) 相对基址变址寻址6) 直接寻址7) 立即数寻址i. 立即数寻址立即数寻址不能用在单操作数指令中ii. 在双操作数中,立即数寻址方式不能用于目的操作数字段指令系统:1) 数据传送指令 mov注意:不允许在两个存储单元之间直接传送数据不允许在两个段寄存器之间传送数据不允许用立即数直接为段寄存器赋值不影响标志位不允许寄存器或存储单元到除CS外的段寄存器2) 入栈(出栈)指令PUSH(POP)注意:PUSH操作数不能是“立即数”POP操作数不能是段寄存器CS 不影响标志位先进后出单操作符3) 交换指令XCHG注意:只允许寄存器与存储单元之间的交换不影响标志位4) 换码指令 XLAT5) 地址传送指令LEA(load effective address):偏移地址()6) 数据段指针送寄存器LDS :低地址的字送指定的通用寄存器(SI)、高地址的字送DS7) 附加段指针送寄存器指令LES :与LDS相似,低地址的字送通用寄存器(DI)、高地址送ES上三指令不影响标志位8) 标志寄存器传送指令LAHF :标志寄存器低八位送AHSAHF :AH送标志寄存器低八位PUSHF:标志寄存器压入堆栈POPF :栈顶内容送标志寄存器9) 加法指令 ADD目的操作数只能是寄存器或存储单元对CF,OF,SF,PF,ZF,AF有影响10) 加1指令 INC对OF,SF,PF,ZF,AF有影响11) 带位加法指令 ADC在进行单精度运算时用ADD指令,在高精度低位运算时用ADD、高位用ADCOPD=OPD+OPS+CF12) 减法指令 SUB对CF,OF,SF,PF,ZF,AF有影响13) 带借位减法指令 SBBOPD=OPD—OPS—CF对CF,OF,SF,PF,ZF,AF有影响对CF,OF,SF,PF,ZF,AF有影响14) 减1指令 DEC15) 比较指令 CMP16) 求补指令 NEG17) 无符号乘法指令 MUL字节操作:AX=AL*OPS字操作:DX,AX=AX*OPS18) 有符号乘法指令 IMUL19) 无符号除法指令 DIV字节的操作:AL=AX/(OPS)的商AH=AX/(OPS)的余数字的操作:20) 有符号除法 IDIV21) 字节转换为字指令 CBW把AL中的符号位扩展到AH中,如果AL的最高位为0,则AH=00H,如果最高位为1,则AH=FFH22) 字转换为双字指令 CWD23) 压缩的BCD码调整指令DAA 加法的十进制调整指令DAS 减法的十进制调整指令24) 非压缩的BCD码调整指令AAA 加法的ASCII调整指令AAS 减法的ASCII调整指令AAM 乘法的ASCII调整指令AAD 除法的ASCII调整指令25) 逻辑与运算指令ADDORNOTTEST(OPD和OPS的内容不变)26) 移位指令逻辑左移与算术左移SHL、SAL(低位补0)算术右移 SAR(高位不变、CF为最后移入的值)逻辑右移 SHR(高位补0、CF为最后移入的值)27) 循环移位左移 ROL (CF为最后移入的值)右移 ROR (CF为最后移入的值)带进位循环左移 RCL(CF+OPD 一起左循环)带进位循环右移 RCR(OPD+CF 一起右循环)28) 无条件转移指令下JMPJMP SHORT OPD(IP=IP+8位位移量)JMP NEAR PTR OPD(IP=IP+16位位移量)上二条指令目的地址是IP=OPD+IPJMP WORD PTR OPD(IP=EA)JMP FAR PTR OPD(IP=OPD的段内偏移地址 CS=OPD段地址)JMP DWORD PTR OPD(IP=EA CS=EA+2)29) 条件转移指令JZ(JE)结果为0则转移(ZF=1)JNZ(JNE)结果不为0则转移(ZF=0)JS 结果为负则转移(SF=1)JNS 结果为正则转移(SF=0)JO 溢出则转移(OF=1)JNO 不溢出则转移(OF=0)JP(JPE)奇偶位为1则转移(PF=1)JNP(JPO)奇偶位不为1则转移(PF=0)JC(JNAE,JB)低于且不等于或进位位为1则转移(CF=1)JNC(JNE,JNB)高于或等于或进位位为0则转移(CF=0)30)。
8086汇编语言学习(一)8086汇编介绍
8086汇编语⾔学习(⼀)8086汇编介绍1. 学习汇编的⼼路历程 进⾏8086汇编的介绍之前,想先分享⼀下我学习汇编的⼼路历程。
rocketmq的学习 其实我并没有想到这么快的就需要进⼀步学习汇编语⾔,因为汇编对于我的当前的⼯作内容来说太过底层。
但在⼏个⽉前,当时我正尝试着阅读rocketmq的源码。
和许多流⾏的java中间件、框架⼀样,rocketmq底层的⽹络通信也是通过netty实现的。
但由于我对netty并不熟悉,在⼯作中使⽤spring-cloud-gateway的时候甚⾄写出了⼀些导致netty内存泄漏的代码,却不太明⽩个中原理。
出于我个⼈的习惯,在学习源码时,抛开整体的程序架构不论,希望⾄少能对其中涉及到的底层内容有⼀个⼤致的掌握,能让我像⿊盒⼦⼀样去看待它们。
趁热打铁,我决定先学习netty,这样既能在⼯作时更好的定位、解决netty相关的问题,⼜能在研究依赖netty的开源项⽬时更加得⼼应⼿。
netty的学习 随着对netty学习的深⼊,除了感叹netty统⼀规整的api接⼝设计,内部交互灵活可配置、同时⼜提供了⾜够丰富的开箱即⽤组件外;更进⼀步的,netty或者说java nio涉及到了许多更底层的东西,例如:io多路复⽤,零拷贝,事件驱动等等。
⽽这些底层技术在redis,nginx,node-js等以⾼效率io著称的应⽤中被⼴泛使⽤。
扪⼼⾃问,⾃⼰在多⼤程度上理解这些技术?为什么io多路复⽤在io密集型的应⽤中,效率能够⽐之传统的同步阻塞io显著提⾼?⼀次⽹络或磁盘的io传输内部到底发⽣了什么,零拷贝到底快在了哪⾥? 如果没有很好的弄明⽩这些问题,那么我的netty学习将是不完整的。
我有限的知识告诉我,答案就在操作系统中。
操作系统作为软硬件的⼤管家,对上提供应⽤程序接⼝(程序员们通常使⽤⾼级语⾔提供的api间接调⽤);对下控制硬件(cpu、内存、磁盘⽹卡等外设);依赖硬件提供控制并发的系统原语;其牵涉的许多模块内容都已经独⽴发展了(多系统进程间通信->计算机⽹络、⽂件系统->数据库)。
8086汇编语言学习(四)8086汇编程序的编译与链接
8086汇编语⾔学习(四)8086汇编程序的编译与链接1、8086汇编源程序从编写到执⾏的过程 前⾯介绍过通过debug模式来进⾏汇编程序的编写和调试。
但是随着深⼊学习,所编写的汇编程序会越来越复杂,⽽通过debug的A命令去逐条编写汇编指令是⾮常低效的。
因此,这⾥将要介绍8086汇编源程序这⼀概念,使得我们可以通过⽂本的⽅式编写汇编程序,并通过⼀系列的措施将其转化为最终的⼆进制可执⾏程序。
⼀个汇编源程序从编写到执⾏⼤概可以分为⼏个阶段: 1. 开发者编写⽂本形式的汇编源程序 2. 对汇编源程序进⾏编译并⽣成⽬标⽂件、对⽬标⽂件进⾏链接并⽣成可执⾏⽂件 3. 运⾏可执⾏⽂件下⾯通过⼀个简单例⼦来详细说明(以windows操作系统下的masm5环境举例):1. 编写汇编源程序 通过系统⾃带的记事本或者更⾼级的⽂本编辑器编写⽂本形式的汇编源程序,将其命名为demo.asm,程序内容如下:assume cs:codesgcodesg segmentmov ax,0123Hmov bx,0456Hadd ax,bxadd ax,axmov ax,4c00Hint 21H ;中断退出程序codesg endsend2. 对汇编源程序进⾏编译、链接编译: 通过命令⾏运⾏masm.exe,先让⽤户输⼊需要编译的汇编源⽂件的本地⽂件地址(Source filename :)。
如果⽂件在当前⼯作路径下可以仅输⼊⽂件名(例如 demo.asm),否则就需要输⼊绝对地址路径(例如 c:\MASM\ASM\demo.asm)。
另外,如果源程序⽂件的默认后缀拓展名为[.ASM],如果是.txt之类的⽂件,则需要输⼊全名(例如 c:\MASM\ASM\demo.txt)。
接着会让⽤户输⼊所⽣成的.obj⽬标⽂件的存放路径以及名称(Object filename :),例如 c:\MASM\ASM\demo.obj。
后⾯的Source listing和Cross-reference能够让masm编译器⽣成编译过程中的中间结果⽂件,这⾥可以直接回车跳过,不去让编译器⽣成。
8086汇编语言学习(二)8086汇编开发环境搭建和Debug模式介绍
8086汇编语⾔学习(⼆)8086汇编开发环境搭建和Debug模式介绍1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语⾔。
⼯欲善其事,必先利其器,在8086汇编语⾔正式开始学习之前,先介绍⼀下如何搭建8086汇编的开发环境。
汇编语⾔设计之初是⽤于在没有操作系统的裸机上直接操作硬件的,但对于⼤部分⼈来说,在8086裸机上直接进⾏编程将会⾯临各种困难。
好在我们可以使⽤软件模拟器来模拟硬件进⾏8086的学习实践。
在《汇编语⾔》中作者推荐通过windows环境下的masm和debug进⾏学习。
masm介绍: masm是⼀款DOS下的汇编⼯具包,在8086汇编的学习中我们需要其中的⼏个⽂件,分别是masm.exe,link.exe。
masm.exe 汇编器,⽤于将⽂本格式的汇编语⾔源⽂件编译为.obj结尾的⼆进制⽂件,其⽣成的.obj结尾的⼆进制⽬标⽂件是被编译的源⽂件的对应的机器码。
单独的源程序⽬标⽂件通常是⽆法直接运⾏的,还需要和互相依赖的其它同样编译完成的⼆进制⽂件链接在⼀起才能⽣成最终的可执⾏⽂件(⽐如所需要的静态库函数) 。
因此,obj⽂件通常也被叫做中间⽂件。
link.exe 链接器,obj⽂件需要通过链接才能转换成可执⾏程序,⽽链接器就是负责完成这⼀任务的。
链接器能将多个obj⽬标⽂件以及其所依赖的库程序进⾏统⼀处理(例如多个⽬标⽂件中指令、数据内存地址的偏移处理),并⽣成可执⾏⽂件。
debug介绍: debug.exe 调试器,windows提供了⼀个在dos中调试8086汇编程序的⼯具debug.exe,提供了展⽰程序运⾏时CPU中各寄存器、内存中数据,指令级的单步调试等功能。
debug程序的使⽤会在本篇博客的后半段进⾏详细介绍。
64位操作系统兼容性问题: 由于《汇编语⾔》⼀书出版较早,当时的windows系统还是32位的,32位windows系统都默认安装了masm与debug,能打开dos窗⼝直接使⽤。
8086 汇编速查手册 (超详细)
例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 传送目标指针,把指针内容装入SS.
例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
ESC 转换到外处理器.
LOCK 封锁总线.
NOP 空操作.
STC 置进位标志位.
CLC 清进位标志位.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 "0" 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
8088 汇编速查手册
一、数据传输指令
二、算术运算指令
三、逻辑运算指令
四、串指令
五、程序转移指令
六、伪指令
8088 汇编速查手册
一、数据传输指令
───────────────────────────────────────
LES 传送目标指针,把指针内容装入ES.
例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS 传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
8086汇编指令汇总
8086汇编指令汇总一、基本指令集1.MOV:用于将一个值从一个位置复制到另一个位置。
2.ADD:将两个操作数相加,并将结果存储在第一个操作数中。
3.SUB:将第二个操作数从第一个操作数中减去,并将结果存储在第一个操作数中。
4.INC:将指定的寄存器或内存位置的值加一5.DEC:将指定的寄存器或内存位置的值减一6.MUL:将两个操作数相乘,并将结果存储在累积寄存器中。
7.DIV:将累积寄存器的值除以指定的操作数,并将商存储在累积寄存器中,余数存储在另一个寄存器中。
二、数据传送指令1.MOVSB:从指定内存位置复制一个字节到另一个位置。
2.MOVSW:从指定内存位置复制一个字到另一个位置。
3.MOVSBW:从指定内存位置复制一个字节到另一个位置,并将其扩展为字。
4.LODSB:从指定内存位置加载一个字节到累积寄存器中。
5.LODSW:从指定内存位置加载一个字到累积寄存器中。
6.STOSB:将累积寄存器中的值存储到指定内存位置。
7.STOSW:将累积寄存器中的值存储到指定内存位置。
8.XCHG:交换两个操作数的值。
三、算术与逻辑指令1.AND:对两个操作数执行逻辑与操作,并将结果存储在第一个操作数中。
2.OR:对两个操作数执行逻辑或操作,并将结果存储在第一个操作数中。
3.XOR:对两个操作数执行逻辑异或操作,并将结果存储在第一个操作数中。
4.NOT:对指定的操作数执行逻辑非操作。
5.SHR:将指定操作数的位向右移动指定的位数。
6.SHL:将指定操作数的位向左移动指定的位数。
7.CMP:比较两个操作数的值,并设置相应的条件码。
四、控制转移指令五、字符串操作指令1.REP/REPE/REPZ:用于重复执行一些指令,并且在条件满足时继续执行,直到满足特定的条件。
2.MOVSB/MOVSW:从一个内存位置复制一个字节或字到另一个位置。
3.CMPSB/CMPSW:将两个内存位置的值进行比较。
4.SCASB/SCASW:在累积寄存器中查找指定的字节或字,并设置相应的条件码。
8086汇编语言学习(七)8086跳转指令
8086汇编语⾔学习(七)8086跳转指令8086跳转指令 ⽬前为⽌,我们的程序的指令执⾏都是线性的,从上到下,由CPU⾃动的增加IP的值,顺序的执⾏指令。
但对于复杂的需求,只有线性的指令执⾏⽅式是远远不够的。
对于⾼级语⾔,有着如if/else的逻辑跳转分⽀,如for/while的循环结构,还有函数⼦程序的调⽤与返回等等。
正是有了这些能够控制程序执⾏指令的不同⽅式,才能具有⾜够的表达能⼒,满⾜⾜够复杂的需求,成为⼀门图灵完备的语⾔。
那么上述的逻辑跳转、循环,在基于图灵机的CPU硬件上是如何实现的呢?通过8086汇编的跳转指令的学习,我们得以⼀窥究竟。
CPU是通过CS:IP来获取下⼀条指令的值,那么通过指令修改CS、IP这两个寄存器的值,便可以控制CPU所执⾏的指令了。
可由于控制CPU执⾏指令的CS、IP⼗分的关键,因此8086并不允许像其它普通的寄存器⼀般使⽤mov等指令对CS、IP修改(mov IP,1000H是⾮法的),⽽是提供了专门的指令来控制CS、IP的值,这⼀类指令被称为8086跳转指令。
跳转指令按照类型可以分为五种:⽆条件跳转指令、有条件跳转指令、循环指令、过程调⽤与返回指令以及中断指令。
⽆条件跳转指令(jmp) jmp既可以只修改IP,也可以同时修改CS和IP。
作为跳转指令,在编程时需要指定跳转的位置,进⽽修改CS/IP的值。
段内转移 段内短转移(IP 变化-128~127):段内短转移的格式为 jmp short [标号]。
assume cs:codesgcodesg segmentstart:mov ax,0jmp short sadd ax,1s:inc axcodesg endsend start 段内近转移(IP 变化-32768~32767):当所要跳转的间隔⼤于短转移的时候,就需要使⽤段内近转移。
段内近转移和短转移类似,格式为 jmp near ptr [标号]。
完整版汇编语言速成秘籍推荐文档
完整版汇编语言速成秘籍推荐文档汇编语言作为低级编程语言的一种,是每个程序员都应该熟悉的技能。
掌握汇编语言可以帮助我们更好地了解计算机底层运行原理,提高程序的性能和效率。
本文将向大家推荐一份完整的汇编语言速成秘籍文档,帮助大家快速入门和掌握汇编语言。
一、简介汇编语言是一种低级的编程语言,与机器语言直接对应,使用符号代表指令和数据。
掌握汇编语言可以更深入地理解计算机底层运行原理,为优化程序性能提供支持。
同时,学习汇编语言也有助于扩展程序设计思维,提高编程技巧。
二、为什么选择完整版汇编语言速成秘籍?1. 全面详尽:完整版汇编语言速成秘籍内容全面,涵盖了汇编语言的基础知识、进阶技巧和实践案例。
无论你是初学者还是有一定经验的程序员,都能从中找到适合自己的学习内容。
2. 经典案例:文档中提供了丰富的实践案例,通过实际问题的解析和演示,帮助读者更好地理解和应用汇编语言。
案例涵盖了常见的程序设计问题和优化技巧,对于提高编程能力有很大帮助。
3. 实用工具:在完整版汇编语言速成秘籍中,还附带了一些实用的工具和资源链接,方便读者深入学习和实践。
这些工具可以帮助读者更好地理解和调试汇编代码,提高学习效果。
三、学习汇编语言的步骤1. 学习基础知识:首先要掌握汇编语言的基础知识,包括常用的指令和寄存器的作用。
完整版汇编语言速成秘籍中提供了清晰的解释和示例代码,可以帮助读者迅速理解和掌握基础知识。
2. 理解程序结构:学习汇编语言还需要理解程序的结构和控制流程。
文档中详细介绍了程序的组成部分和逻辑结构,通过实例演示,帮助读者掌握程序的编写和调试技巧。
3. 实践演练:通过实践演练,将学到的知识应用到实际问题中。
完整版汇编语言速成秘籍中提供了多个实践案例,读者可以根据自己的兴趣和需求选择相应的项目进行实践。
4. 进阶优化:学习汇编语言不仅可以实现功能,还可以提高程序的性能和效率。
在完整版汇编语言速成秘籍中,有一些进阶优化技巧和实践经验的分享,读者可以借鉴和应用于自己的项目中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
判断依据
无
符
号 A=B
CF=1
A<B
CF 或 ZF=0
A>B
A=B
1
0
CF=0
A>=B
A<B
0
1
CF 或 ZF=1
A<=B
A B 大小关 系
>0 >0 A>B
相关标志位 SF ZF OF 000
判断条件 ZF=1
大小关系 有
符
A=B
号
>0 >0 A<B
100
SF 异或 OF=1
A<B
>0 <0 A>B <0 >0 A<B <0 <0 A<B
Src 字节AL←AX÷src 商, 8 位 reg
80 ~ 90
2
不影响标志位除非溢出
AH←AX÷src 余数,Src 8 位 mem 字 AX←DX AX÷src 商, 16 位 reg
(86~96)+EA 144 ~ 162
2~4 2
不能是压缩的 BCD 数
DX←DX AX÷src 余数 16 位 mem Src 字节AL←AX÷src 商, 8 位 reg AH←AX÷src 余数,Src 8 位 mem 字 AX←DX AX÷src 商, 16 位 reg
reg, imm 4
reg, reg
2
mem, reg 9+EA
mem, seg 9+EA
mem, imm 10+EA
seg, reg
2
seg, mem 8+EA
字节数 2
2~4 2~3
2 2~4 2~4 3~6
2 2~4
说明 Cs 不能做目标操作数,不 能被赋值。 段寄存器之间不能传输数据。
目标操作数和源操作数不能 同时为内存操作数(存储器 操作数)。 寄存器中的数为操作数地址 时为内存操作数,如【XX】。
8086 汇编总结
加
ADD dst, src
(算术
运算指
令)
ADC dst, src 带进位加法
INC dest
减 (算术 运算指 令)
SUB dest, src
SBBdest ,src 带进位减法
DEG dest
NEG dest 求补指令 CMP dest, src 比较指令
乘 (算术 运算指 令)
(des) ←→ (src)
reg, mem reg, reg
17+EA 4
mem, reg 3
XLAT
AL←DS 中逻辑地址为
11
换码指令
(BX+AL)的内存单元
输入 输出指 令
IN AL/AX, port OUT port, AL/AX IN AL/AX,DX
(acc) ← (port) (port) ← (acc) (acc) ← ((DX))
用 SP 堆栈指针
给出栈顶偏移地址
寄 SI 源变址寄存器
存器 DI
目的变址寄存器
数据寄存器
指针寄存器 堆栈段偏移地址 变址寄存器 数据段偏移地址
标志 F 标志寄存器
,
标志寄存器
总线 段 接口 寄 部件 存 BIU 器
CS 代码段 DS 数据段 ES 附加段 SS 堆栈段
不能被赋值 复位后为 FFFFH 复位后为 0000H
除 (算术 运算指 令)
DIV src IDIV src
程伟整理
F← ((SP)+1, (SP)) (SP) ← (SP)+2(出栈)
隐含操作数, 8 数据出栈到 标志寄存器
1
10 DF 2 PF
9 IF 1
8 TF 0 CF
2、算术运算指令 (都对 F 寄存器产生影响)
功
能
操作数说明 时钟周期数 字节数
寻址方式
操作数物理地址(PA)
指令格式举例
立即寻址 寄存器寻址 直接寻址 寄存器间接寻址
寄存器相对寻址
基址变址寻址
操作数在指令中直接给出 操作数在寄存器中 操作数的有效地址由指令直接给出 PA=(DS)|(SS)×16+
(BX)|(SI)|(DI)|(BP) PA=(DS|SS)×16+
(BX|BP|SI|DI)+偏移量 PA=(DS|SS)×16+
hing at a time and All things in their being are good for somethin
8086 汇编总结
程伟整理
8086 汇编总结
一、8086 编程结构
执 通 AX 累加器
行 用 BX 基数寄存器
部 寄 CX 计数器
件
存器 DX
数据寄存器
EU
专 BP 基数指针
8086 汇编总结 POPF 标志弹出 指令
类型 辅助运 算指 令
汇编指令格式 CBW
CWD
B
DAA
C
压缩 BCD 数
D
加法调整
数
(
算
术
运
算
DAS
结
压缩 BCD 数
果
减法调整
)
调
整
指
令
AAA 加法 ASCII 码调整
AAS 减法 ASCII 码调整
AAM 乘法
ASCII 码调整
AAD 除法 ASCII 码调整
(BP|BX)+(SI|DI)
源操作数为地址 操作数需要寻址
MOV DX,100H ; (DX)←100H ADD AX,BX ; (AX)←(AX)+(BX)
操作数需要计算 MOV AX,[100] ; (AX)←(100)
给出的均为操作 MOV AX,[BX] ;
数的逻辑地址,而且 (AX)←((DS)×16+(BX))
为 0)
reg, imm
mem, imm
acc, imm
(dest) ← (dest)+1
reg mem
(dst) ← (src) - (dst)
mem, reg reg, mem
reg, reg
reg, imm
mem, imm
(dst) ← (src) - (dst) - CF mem, reg reg, mem
r16 ←m32 的底 16 位 (DS) ←m32 的高 16 位 r16 ←m32 的底 16 位 (ES) ←m32 的高 16 位
r16, m32 r16, m32
16+EA 16+EA
标志传 送指令 (唯一 对F寄
LAHF 取标志 SAHF 置标志 PUSHF 标志入栈 指令
(AH) ← (F 低 8 位字节) 隐含操作数 4 (F 低 8 位字节) ← (AH) 隐含操作数 4 (SP) ← (SP)-2(先入栈) 隐含操作数, 10
MUL src IMUL src
(dst) ← (src) + (dst)
mem, reg reg, mem
reg, reg
reg, imm
mem, imm
acc, imm
(dst) ← (src) + (dst) + mem, reg CF(最高位进位标志 reg, mem
符,有进位为 1,否则 reg, reg
说明
AX←AL
字节扩展到
不影响标志位
字
AL<80H 时 AH=00H , AL>=80H 时 AH=FFH
DXAX←AX
字扩展到双 AX<8000H 时 DX=0000H, AX>=8000H 时 DX=FFFFH
字
对于符号数:最高位为 0 表示正,为 1 表示负
(AL) ← (AX) / (src) 的
8086 汇编总结 相对基址变址寻址
PA=(DS|SS)×16+ (BX|BP)+(SI|DI)+偏移量
程伟整理 MOV AX, OFFSET (BX+DI); (AX)←((DS)×16+(BX)+(DI)+OFFS ET)
B——二进制
D——十进制
Q——八进制
H——十六进制
四、符号约定及含义
符号
含义
一个 8 位或 16 位存储器操作数
m32
一个 32 位的存储器操作数
dest
Байду номын сангаас目标操作数
src
源操作数
port
I/O 端口
五、CMP 指令的结果判断方法
大小关系 A-B 相关标志位
ZF
CF
A>B
0
0
ZF=1
立即数
AH AL BH BL CH CL DH DL AX BX CX DX BP SP SI DI DS CS ES SS
i8
一个 8 位立即数
i16
一个 16 位立即数
imm
一个 8 位或 16 位立即数
r8
一个 8 位通用寄存器
r16
一个 16 位通用寄存器或专用寄存器
reg
一个 8 位或 16 位通用寄存器或专用寄存器
seg
一个 16 位段寄存器
m8
一个 8 位的存储器操作数
m16
一个 16 位的存储器操作数
mem
(150~168)+EA 101 ~ 112 (107~118)+EA 165 ~ 184
2~4 2
2~4 2
DX←DX AX÷src 余数 16 位 mem (171~190)+EA 2 ~ 4