坚持不谢 發表於 2022-9-13 23:38:00

汇编语言Assembly Language.asm--8086(持续更新)

<p><span style="font-size: 18px"><strong><span style="color: rgba(224, 62, 45, 1)">汇编语言Assembly Language.asm--8086</span></strong></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>数据转移指令MOV   数据流向图</p>
<p><img src="https://img2022.cnblogs.com/blog/2710778/202209/2710778-20220914000014188-40321522.png"></p>
<p><span style="font-size: 18px">XCHG OPD,OPS数据交换指令</span></p>
<p><span style="font-size: 18px">功能:将源操作数和目的操作数内容互换</span></p>
<p><span style="font-size: 18px">AX=1234H XCHG AL,AH 执行后(AX)=3412H</span></p>
<p><span style="font-size: 18px">注意:不能使用段寄存器执行交换操作</span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">XCHG DS,AX ×交换指令不能使用段寄存器segment register</span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">XCHG BUF1,BUF2 ×两个操作数不能同时为存储器操作数;</span></p>
<p>&nbsp;</p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>MOV ES,SEG BUF; ×变量不能直接送入ES,要通过其他寄存器送入;</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>MOV DS,DATA; ×变量不能直接送入ES,要通过其他寄存器送入;</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>MOV CS,AXL; ×CS只能读出,不能送入;</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>MOV DS,BUF; ×BUF为字变量,其所在的段与DS建立联系;语法正确,执行结果可能不对;</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>立即数只能送出,不能送入;只能作为源操作数;</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>不能将立即数送入DS,ES,FS,GS,SS</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>不能使用MOV将任何数据送入CS;</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>不能用MOV修改CS、IP,只能用JMP指令;</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>ADD WORD PTR , ×两个操作数都是存储器操作数</strong></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>指令的共同要求:</strong></span></p>
<ol>
<li><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>双操作数的操作数类型(字节数)必须匹配;MOV AX,BL ×</strong></span></li>
<li><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>目的操作数不能是立即数;CMP 2,AX ×</strong></span></li>
<li><span style="color: rgba(224, 62, 45, 1); font-size: 18px"><strong>目的操作数和源操作数不能同时为存储器操作数;MOV BUF1,BUF2 ×</strong></span></li>
</ol>
<p><span style="font-size: 18px">MOVSX指令(386指令)<span style="color: rgba(224, 62, 45, 1)">有符号数</span>传送指令;相当于类型转换;</span></p>
<p><span style="font-size: 18px">功能:将源操作数的符号向前扩展(前面的数全部与符号位相同)成与目的操作数相同的数据类型后,再送入目的地址对应的单元中;扩展之后的数和原数的值相同,但是类型不同(所占字节数变多了);</span></p>
<p><span style="font-size: 18px">OPS不能是立即数;</span></p>
<p><span style="font-size: 18px">OPD必须是16/32位寄存器;</span></p>
<p><span style="font-size: 18px">源操作数位数必须小于目的操作数的位数;</span></p>
<table style="border-collapse: collapse; background-color: rgba(251, 238, 184, 1)">
<tbody>
<tr>
<td width="356">
<p><span style="font-size: 18px">例题:MOV BL,0E3H</span></p>
<p><span style="font-size: 18px">MOVSX EBX,BL</span></p>
<p><span style="font-size: 18px">(EBX)=?</span></p>
<p>&nbsp;</p>
</td>
<td width="356">
<p><span style="font-size: 18px">BYTE0 DB 0A8H</span></p>
<p><span style="font-size: 18px">MOV BL,BYTE0</span></p>
<p><span style="font-size: 18px">MOVSX ECX,BL</span></p>
<p><span style="font-size: 18px">MOVSX EBX,BYTE0</span></p>
</td>
</tr>
<tr>
<td width="356">
<p><span style="font-size: 18px">0E3H=11100011B→BL</span></p>
<p><span style="font-size: 18px">BL→EBX,符号位1向前扩展,高8位全扩展成1</span></p>
<p><span style="font-size: 18px">(EBX)=1111 1111 1110 0011B=0FFE3H</span></p>
</td>
<td width="356">
<p><span style="font-size: 18px">0A8H=1010 1000B→BL</span></p>
<p><span style="font-size: 18px">BL→ECX,符号位1向前扩展,高8位全1</span></p>
<p><span style="font-size: 18px">(ECX)=1111 1111 1010 1000B=0FFA8H</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">立即数immediate operand:</span></p>
<ul>
<li><span style="font-size: 18px">立即数可以有三种表示方式,二进制、十进制、十六进制;</span></li>
<li><span style="font-size: 18px">十六进制立即数需加后缀H;二进制立即数需加B;十进制立即数不需要后缀;</span></li>
<li><span style="font-size: 18px">十六进制立即数,如果最前面一个数是字母,需要在字母前加0;</span></li>
<li><span style="font-size: 18px">FFH应该表示为0FFH,从而告诉编译器这是一个立即数,而不是一个变量;</span></li>
<li><span style="font-size: 18px">立即数只能作为源操作数,不能作为目的操作数;</span></li>
<li><span style="font-size: 18px">立即数低字节存放在低地址,高字节存放在高地址;小端模式;</span></li>
<li><span style="font-size: 18px">反过来存放,也就是低字节存放在高地址,称为大端模式;</span></li>
</ul>
<p><span style="font-size: 18px"><img src="https://img2022.cnblogs.com/blog/2710778/202209/2710778-20220913233405466-1539859579.png"></span></p>
<p><span style="font-size: 18px">BP、EBP、ESP系统默认操作数在堆栈中,等同于SS:;base pointer,stack pointer;</span></p>
<p><span style="font-size: 18px">其他情况下,默认操作数在DS寄存器中;</span></p>
<p><span style="font-size: 18px">从目标地址中取多少数据,取决于目标寄存器,AX作为目标寄存器,则取16位,AH作为目标寄存器,则取8位,以此类推;数据类型,取决于目标操作数类型,目标操作数是几个字节,就取几个字节;</span></p>
<p><span style="font-size: 18px">SP指向栈顶;</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">指针寄存器包括堆栈寄存器SP(stack pointer)和基数指针寄存器BP(base pointer),变值寄存器包括源变址寄存器SI(source index)和目的变值寄存器DI(destination index)。这4个寄存器都是16位寄存器,这些寄存器在运算过程中也可以用来存放操作数(只能以字为单位),但经常的用途是在段内寻址时提供偏移地址;</span></p>
<p><span style="font-size: 18px">SP,BP一般与段寄存器SS联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的偏移地址,而BP可作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。</span></p>
<p><span style="font-size: 18px">SI,DI一般与段寄存器DS联用,以确定数据段中某一存储单元的地址,SI,DI具有自动增量和自动减量的功能,这一点使在串操作指令中用做变址非常方便,SI作为隐含的源变址DS联用,DI作为隐含的目的变址和ES连用,从而达到在数据段和附加段中寻址的目的;</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">描述符表(descriptor table)</span></p>
<table style="border-collapse: collapse; background-color: rgba(236, 202, 250, 1)">
<tbody>
<tr>
<td width="72">
<p><span style="font-size: 18px">简称</span></p>
</td>
<td width="258">
<p><span style="font-size: 18px">全称</span></p>
</td>
<td width="560">
<p><span style="font-size: 18px">描述</span></p>
</td>
</tr>
<tr>
<td width="72">
<p><span style="font-size: 18px">GDT</span></p>
</td>
<td width="258">
<p><span style="font-size: 18px">global descriptor table</span></p>
<p><span style="font-size: 18px">全局描述符表</span></p>
</td>
<td width="560">
<p><span style="font-size: 18px">每一个系统只能有一个,所有的程序和任务共享使用;通过指令lgdt将GDT的入口地址加载到GDTR寄存器中。</span></p>
</td>
</tr>
<tr>
<td width="72">
<p><span style="font-size: 18px">LDT</span></p>
</td>
<td width="258">
<p><span style="font-size: 18px">local descriptor table</span></p>
<p><span style="font-size: 18px">局部描述符表</span></p>
</td>
<td width="560">
<p><span style="font-size: 18px">可以定义多个,可以被隔离的任务单独定义也可以被多个任务共享;LDT在系统中作为一个段存储,通过指令lldt将段描述符加载到LDTR寄存器中,GDT必须包含LDT段的描述符。</span></p>
</td>
</tr>
<tr>
<td width="72">
<p><span style="font-size: 18px">IDT</span></p>
</td>
<td width="258">
<p><span style="font-size: 18px">Interrupt descriptor table</span></p>
<p><span style="font-size: 18px">中断描述符表</span></p>
</td>
<td width="560">
<p><span style="font-size: 18px">保存256个门描述符。门描述符包括中断门描述符、陷阱门描述符和任务门描述符</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">GDTR=global descriptor table register=全局描述符表寄存器;</span></p>
<p><span style="font-size: 18px">LDTR=local descriptor table register=局部描述符表寄存器;</span></p>
<p><span style="font-size: 18px">Privilege英 /ˈprɪvəlɪdʒ/ 美 /ˈprɪvəlɪdʒ/n. 特权,特殊待遇;</span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">特权级=PL=Privilege Level</span></p>
<table style="border-collapse: collapse; background-color: rgba(191, 237, 210, 1); width: 56.5757%">
<tbody>
<tr>
<td style="width: 33.5648%" width="237">
<p><span style="font-size: 18px">描述符特权级(DPL,Descriptor Privilege Level)</span></p>
</td>
<td style="width: 66.4352%" width="470">
<p><span style="font-size: 18px">实施特权级保护的第一步,是为所有可管理的对象赋予一个特权级,以决定谁能访问它们。每个 Descriptor 都具有描述符特权级(DPL,Descriptor Privilege Level)字段,Descriptor 总是指向它所“描述”的目标对象,代表着该对象,因此该字段(DPL)实际上是目标对象的特权级。</span></p>
</td>
</tr>
<tr>
<td style="width: 33.5648%" width="237">
<p><span style="font-size: 18px">当前特权级(CPL,Current Privilege Level)</span></p>
<p>&nbsp;</p>
</td>
<td style="width: 66.4352%" width="470">
<p><span style="font-size: 18px">当处理器正在一个代码段中取指令和执行指令时,那个代码段的特权级叫做当前特权级(Current Privilege Level, CPL)。 正在执行的这个代码段,其选择子位于段寄存器CS中,其最低两位就是当前特权级的数值。</span></p>
</td>
</tr>
<tr>
<td style="width: 33.5648%" width="237">
<p><span style="font-size: 18px">请求特权级(RPL,Request Privilege Level)</span></p>
</td>
<td style="width: 66.4352%" width="470">
<p><span style="font-size: 18px">RPL也就是指请求者的特权级别(Requestor’s Privilege Level)。</span></p>
</td>
</tr>
<tr>
<td style="width: 33.5648%" width="237">
<p><span style="font-size: 18px">特权指令(Privileged Instructions)</span></p>
</td>
<td style="width: 66.4352%" width="470">
<p><span style="font-size: 18px">不同特权级别的程序,所担负的职责以及在系统中扮演的角色是不一样的。计算机系统的脆弱性在于一条指令就能改变它的整体运行状态,比如停机指令hlt 和对控制寄存器CRO的写操作,像这样的指令只能由最高特权级别的程序来做。因此,那些只有在当前特权级 CPL 为 0 时才能执行的指令,称为特权指令(Privileged Instructions)。</span></p>
</td>
</tr>
<tr>
<td style="width: 33.5648%" width="237">
<p><span style="font-size: 18px">输出特权级(I/O Privilege Level)</span></p>
</td>
<td style="width: 66.4352%" width="470">
<p><span style="font-size: 18px">在处理器的标志寄存器EFLAGS中,位13、位12是IOPL位,也就是输入/输出特权级(I/O Privilege Level),它代表着当前任务的I/O特权级别。某些指令,例如IN,OUT,CLI需要 I/O 特权,这些操作根据 IOPL 和 CPL 确定合法性。</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">CPU特权级别</span></p>
<p><span style="font-size: 18px">Intel CPU 拥有四个特权级别,由r0到r3,由 寄存器 中的两个隐藏位(bit)指定:</span></p>
<p><span style="font-size: 18px">00为r0,01为r1,10为r2,11为r3。</span></p>
<p><span style="font-size: 18px">权限大小: r0&gt;r1&gt;r2&gt;r3,每种特权级别所能执行的 CPU指令 都不同,r0能执行所有 指令,其它三个能执行的 指令 依次递减。</span></p>
<p><span style="font-size: 18px">Windows 使用r0作为 内核态 特权级别,使用r3作为 用户态 特权级别,其它 CPU 和系统具体情况不了解,应该大同小异。</span></p>
<p><span style="font-size: 18px">程序员在用户程序开发过程中,会遇到两个基本概念即用户态和内核态,我们所说的模式切换,就是用户态和内核态之间的切换。</span></p>
<p><span style="font-size: 18px">用户态和内核态其实是CPU的特权级,所以模式的切换就是CPU特权级的切换,模式等同于特权级,不同的模式表示CPU处于不同的特权级下,因此CPU特权级的切换不能局限于用户态到内核态之间,理论上CPU可以在任何特权级之间互相切换。</span></p>
<p><span style="font-size: 18px">CPU特权级表示处理器访问计算机资源时,CPU所处的特权级即CPL,CPU处于不同的特权级,它能访问的计算机资源范围不同,计算机资源包括内存段(代码段,数据段,栈段),IO设备,核心数据结构。</span></p>
<p><span style="font-size: 18px">特权级根据权限大小,分为4个等级即0,1,2,3,如下图</span></p>
<p><span style="font-size: 18px"><img src="https://img2022.cnblogs.com/blog/2710778/202208/2710778-20220828150000311-769484389.png"></span></p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">程序访问流程</span></p>
<p><span style="font-size: 18px">虚拟地址→LDTR→GDT→GDTR→LDT→程序段</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">LDTR局部描述符表寄存器</span></p>
<p><span style="font-size: 18px">GDTR全局描述符表寄存器</span></p>
<p>&nbsp;</p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">全局描述符表</span></p>
<ul>
<li><span style="font-size: 18px">Global Description Table 简称GDT</span></li>
<li><span style="font-size: 18px">只有一个,GDT最大可为64KB,存放8192个描述符</span></li>
<li><span style="font-size: 18px">操作胸痛所使用的段描述符</span></li>
<li><span style="font-size: 18px">各个LDT段的描述</span></li>
<li><span style="font-size: 18px">GDT包括OS代码段描述符、OS数据段描述符、OS堆栈段描述符、各个局部段描述符LDT;</span></li>
</ul>
<p>&nbsp;</p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">局部描述符表</span></p>
<p><span style="font-size: 18px">Local Description Table 简称LDT</span></p>
<ul>
<li><span style="font-size: 18px">一个LDT是一个系统段,最大可为64KB,最多可以存放8192个描述符。</span></li>
<li><span style="font-size: 18px">(64KByte/8Byte per Descriptor)</span></li>
<li><span style="font-size: 18px">对每一个程序,都建立一个局部描述符表(LDT)</span></li>
<li><span style="font-size: 18px">描述符的集合:描述程序的代码段、数据段、堆栈段...</span></li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">段的保护</span></p>
<p><span style="font-size: 18px">要保护一个段,应该提供哪些信息?这些信息存放在何处?</span></p>
<ul>
<li><span style="font-size: 18px">段的起始位置(段基地址)</span></li>
<li><span style="font-size: 18px">段的大小(段界限)</span></li>
<li><span style="font-size: 18px">段的特权级</span></li>
<li><span style="font-size: 18px">段的属性(是代码段、数据段,还是堆栈段)</span></li>
<li><span style="font-size: 18px">(数据段是否可写?代码段是否可读出?)</span></li>
<li><span style="font-size: 18px">段的位置(在内存还是在磁盘?)</span></li>
<li><span style="font-size: 18px">段的类型(在系统段还是用户段?)</span></li>
<li><span style="font-size: 18px">段的使用(段被访问过,还是没有?)</span></li>
</ul>
<p>&nbsp;</p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">内存分段的意义</span></p>
<ul>
<li><span style="font-size: 18px">在多任务环境下,系统中有多个程序在运行;</span></li>
<li><span style="font-size: 18px">程序之间需要隔离!</span></li>
<li><span style="font-size: 18px">分段是存储管理的一种方式,为保护提供基础;</span></li>
<li><span style="font-size: 18px">不同程序在不同段中;</span></li>
<li><span style="font-size: 18px">一个程序可以包含多个段;</span></li>
<li><span style="font-size: 18px">段用于封闭具有共同属性的存储区域;</span></li>
</ul>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">程序的本质:数据以及对数据的加工。</span></p>
<p>&nbsp;</p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">汇编语言学习目标</span></p>
<ul>
<li><span style="font-size: 18px">深刻理解计算机工作的本质</span></li>
<li><span style="font-size: 18px">掌握语法:指令格式(关键:寻址方式)</span></li>
<li><span style="font-size: 18px">掌握语义:指令功能(关键:分类记忆)</span></li>
<li><span style="font-size: 18px">灵活应用:阅读、编写程序(关键:实践)</span></li>
</ul>
<p><span style="font-size: 18px">构建主义学习理论:从已有的知识经验中生长出新的知识经验;</span></p>
<p>&nbsp;</p>
<p><span style="color: rgba(224, 62, 45, 1); font-size: 18px">学习汇编语言的意义</span></p>
<ol>
<li><span style="font-size: 18px">理解C等高级语言的最好途径;</span></li>
</ol>
<ul>
<li><span style="font-size: 18px">为什么调用一个函数后,能正确返回?</span></li>
<li><span style="font-size: 18px">函数之间是如何传递参数的?</span></li>
<li><span style="font-size: 18px">为什么局部变量的作用域只在函数内部?</span></li>
<li><span style="font-size: 18px">递归程序如何理解?</span></li>
<li><span style="font-size: 18px">数组越界访问时怎么回事?</span></li>
<li><span style="font-size: 18px">指针是如何指向对应对象的?</span></li>
<li><span style="font-size: 18px">Union结构是如何转换的?</span></li>
</ul>
<ol start="2">
<li><span style="font-size: 18px">解密程序、逆向工程、病毒木马分析和防止的唯一选择;</span></li>
<li><span style="font-size: 18px">了解操作系统运行细节的最佳方式;</span></li>
<li><span style="font-size: 18px">特性场合下编写程序的必然选择;</span></li>
</ol>
<p><span style="font-size: 18px">了解计算机工作原理和后续课程学习的基础;</span></p>
<p><span style="font-size: 18px">MODEM=MOdulator+DEModulator</span></p>
<p><span style="font-size: 18px">调制器=modulator:数字信号→模拟信号</span></p>
<p><span style="font-size: 18px">解调器=demodulator:模拟信号→数字信号</span></p>
<p><span style="font-size: 18px">modem英 /ˈməʊdem/ 美 /ˈmoʊdəmˌˈmoʊdem/调制解调器(等于 modulator-demodulator)</span></p>
<p><span style="font-size: 18px"><span style="color: rgba(224, 62, 45, 1)">半双工(一条线)</span>:收完再发,发完再收,分时使用;</span></p>
<p><span style="font-size: 18px"><span style="color: rgba(224, 62, 45, 1)">全双工(两条线)</span>:一条接收,一条发送,同时进行;</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">中断向量:段基址CS占2字节,偏移地址IP占2字节,共4字节;</span></p>
<p><span style="font-size: 18px">中断向量表:低地址存放IP,高地址存放CS;</span></p>
<p><span style="font-size: 18px">8086共支持256个中断向量,共占用256*4=1024字节(1KB)</span></p>
<p><span style="font-size: 18px">向量表地址范围:0000H-03FFH</span></p>
<table style="border-collapse: collapse; background-color: rgba(194, 224, 244, 1)">
<tbody>
<tr>
<td width="224">
<p><span style="font-size: 18px">分类,共256个</span></p>
</td>
<td width="487">
<p><span style="font-size: 18px">类型</span></p>
</td>
</tr>
<tr>
<td width="224">
<p><span style="font-size: 18px">专用中断*5</span></p>
</td>
<td width="487">
<p><span style="font-size: 18px">0:除法中断</span></p>
<p><span style="font-size: 18px">1,单步中断</span></p>
<p><span style="font-size: 18px">2,NMI中断,</span></p>
<p><span style="font-size: 18px">3,断点中断</span></p>
<p><span style="font-size: 18px">4,溢出中断</span></p>
</td>
</tr>
<tr>
<td width="224">
<p><span style="font-size: 18px">备用中断*59</span></p>
</td>
<td width="487">
<p><span style="font-size: 18px">类型5-类型3FH</span></p>
<p><span style="font-size: 18px">不允许用户改变其用途;</span></p>
<p><span style="font-size: 18px">10-1FH为ROM-BIOS中断;</span></p>
<p><span style="font-size: 18px">21H为DOS系统调用;</span></p>
</td>
</tr>
<tr>
<td width="224">
<p><span style="font-size: 18px">用户中断*192</span></p>
</td>
<td width="487">
<p><span style="font-size: 18px">类型40H-FFH</span></p>
<p><span style="font-size: 18px">由用户自定义</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="font-size: 18px">中断处理优先级:</span></p>
<ol>
<li><span style="font-size: 18px">除法错误中断、溢出中断、INT N中断、断点中断;</span></li>
<li><span style="font-size: 18px">非屏蔽中断NMI;</span></li>
<li><span style="font-size: 18px">可屏蔽中断INTR;</span></li>
<li><span style="font-size: 18px">单步中断;</span></li>
</ol>
<p>&nbsp;</p>
<ul>
<li><span style="font-size: 18px">NMI=Non Maskable Interrupt=不可屏蔽中断(即CPU不能屏蔽)</span></li>
<li><span style="font-size: 18px">INTR=INTerrupt Request=中断请求</span></li>
</ul>
<p>&nbsp;</p>
<ul>
<li><span style="font-size: 18px">中断向量=中断服务程序的CS:IP=中断服务程序的入口地址</span></li>
<li><span style="font-size: 18px">中断向量表=各种中断的服务程序的CS:IP地址列表=各种中断服务程序的入口地址列表</span></li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size: 18px">中断:用以提高计算机工作效率;</span></p>
<p><span style="font-size: 18px">中断:是指在正常执行程序过程中,由于内部/外部事件或由程序的预先安排,引起CPU暂时中断当前程序的运行,而转去执行为事件服务的子程序,带中断服务子程序执行完毕后,CPU再返回到暂停处(断点)继续执行原来的程序;</span></p>
<p><span style="font-size: 18px">中断技术的优点:并行操作、实时处理、故障处理、分时操作;</span></p>
<p><span style="font-size: 18px">中断源:能引起中断的外部设备或内部原因称为中断源;</span></p>
<ol>
<li><span style="font-size: 18px">设备中断:键盘、打印机等的数据传送请求;</span></li>
<li><span style="font-size: 18px">指令中断:为方便用户使用系统资源或调试软件而设置的中断指令INT N;</span></li>
<li><span style="font-size: 18px">故障中断:如电源掉电、奇偶校验错误、协处理器中断请求等;</span></li>
<li><span style="font-size: 18px">实时时钟中断:定时检测和时间控制;</span></li>
<li><span style="font-size: 18px">CPU运算错误:除法出错、运算溢出、程序调试断点;</span></li>
</ol>
<p><span style="font-size: 18px">存储器</span></p>
<table style="border-collapse: collapse; background-color: rgba(191, 237, 210, 1)">
<tbody>
<tr>
<td rowspan="3" width="95">
<p><span style="font-size: 18px">用途</span></p>
</td>
<td width="308">
<p><span style="font-size: 18px">内存=内存储器=主存储器</span></p>
</td>
</tr>
<tr>
<td width="308">
<p><span style="font-size: 18px">外存=外存储器=辅助存储器</span></p>
</td>
</tr>
<tr>
<td width="308">
<p><span style="font-size: 18px">高速缓存cache,位于CPU和主存之间</span></p>
</td>
</tr>
<tr>
<td width="95">
<p><span style="font-size: 18px">介质</span></p>
</td>
<td width="308">
<p><span style="font-size: 18px">半导体存储器、磁表面存储器、光表面存储器</span></p>
</td>
</tr>
<tr>
<td width="95">
<p><span style="font-size: 18px">读写功能</span></p>
</td>
<td width="308">
<p><span style="font-size: 18px">只读存储器ROM、随机存储器RAM</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">IO端口</span></p>
<table style="border-collapse: collapse; background-color: rgba(194, 224, 244, 1)">
<tbody>
<tr>
<td width="80">
<p><span style="font-size: 18px">分类</span></p>
</td>
<td width="258">
<p><span style="font-size: 18px">定义</span></p>
</td>
<td width="194">
<p><span style="font-size: 18px">优点</span></p>
</td>
<td width="178">
<p><span style="font-size: 18px">缺点</span></p>
</td>
</tr>
<tr>
<td width="80">
<p><span style="font-size: 18px">统一编制=存储器映射</span></p>
</td>
<td width="258">
<p><span style="font-size: 18px">端口和存储单元统一编制,将IO端口地址置于1MB的存储器空间中,在整个存储器空间中划出一部分空间给外设端口,把它们看做存储器单元对待;</span></p>
<p>&nbsp;</p>
</td>
<td width="194">
<p><span style="font-size: 18px">CPU访问存储器的各种寻址方式都可以用于寻址端口,访问端口和访问存储器单元在形式上完全一样;</span></p>
<p><span style="font-size: 18px">使用通用指令访问 ;</span></p>
</td>
<td width="178">
<p><span style="font-size: 18px">端口占用存储器地址空间,</span></p>
<p><span style="font-size: 18px">使存储器容量更加紧张;</span></p>
<p><span style="font-size: 18px">端口指令长度增加,执行时间较长,译码复杂;</span></p>
</td>
</tr>
<tr>
<td width="80">
<p><span style="font-size: 18px">独立编址=IO映射</span></p>
</td>
<td width="258">
<p><span style="font-size: 18px">端口单独编制构成一个IO空间,不占用存储器地址;CPU设置了专门的输入输出指令IN/OUT来访问端口;</span></p>
</td>
<td width="194">
<p><span style="font-size: 18px">不占用存储器地址;</span></p>
<p><span style="font-size: 18px">指令较短,执行较快,译码简单;</span></p>
</td>
<td width="178">
<p><span style="font-size: 18px">指令类别少;</span></p>
<p><span style="font-size: 18px">需要专用指令来访问;</span></p>
<p><span style="font-size: 18px">CPU必须提供控制信号,以区分访问存储还是IO;</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">8086结构</span></p>
<table style="border-collapse: collapse; background-color: rgba(251, 238, 184, 1)">
<tbody>
<tr>
<td width="180">
<p><span style="font-size: 18px">分类</span></p>
</td>
<td width="235">
<p><span style="font-size: 18px">组成</span></p>
</td>
<td width="295">
<p><span style="font-size: 18px">功能</span></p>
</td>
</tr>
<tr>
<td width="180">
<p><span style="font-size: 18px">执行部件=EU</span></p>
<p><span style="font-size: 18px">=execution unit</span></p>
</td>
<td width="235">
<p><span style="font-size: 18px">算术逻辑单元ALU*1</span></p>
<p><span style="font-size: 18px">通用寄存器*8</span></p>
<p><span style="font-size: 18px">状态标志寄存器FLAG*1</span></p>
<p><span style="font-size: 18px">数据暂存寄存器*1</span></p>
<p><span style="font-size: 18px">控制电路</span></p>
</td>
<td width="295">
<p><span style="font-size: 18px">从BIU指令队列,取出指令</span></p>
<p><span style="font-size: 18px">向BIU发出指令,取出数据</span></p>
<p><span style="font-size: 18px">执行指令的全部功能</span></p>
<p><span style="font-size: 18px">向BIU发出指令,写入结果</span></p>
<p>&nbsp;</p>
</td>
</tr>
<tr>
<td width="180">
<p><span style="font-size: 18px">总线接口部件=BIU</span></p>
<p><span style="font-size: 18px">=bus interface unit</span></p>
</td>
<td width="235">
<p><span style="font-size: 18px">段地址寄存器*4</span></p>
<p><span style="font-size: 18px">指令指针寄存器IP*1</span></p>
<p><span style="font-size: 18px">指令队列缓冲器*1</span></p>
<p><span style="font-size: 18px">地址加法器*1</span></p>
<p><span style="font-size: 18px">总线控制电路</span></p>
</td>
<td width="295">
<p><span style="font-size: 18px">从指令单元取出指令</span></p>
<p><span style="font-size: 18px">将指令送至缓冲器或EU</span></p>
<p><span style="font-size: 18px">从指定单元或外设取出操作数</span></p>
<p><span style="font-size: 18px">将操作数送至EU</span></p>
<p><span style="font-size: 18px">将EU运算结果送至存储单元或外设</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">寄存器*14</span></p>
<table style="border-collapse: collapse; width: 52.1092%; background-color: rgba(191, 237, 210, 1)">
<tbody>
<tr>
<td style="width: 17.2825%" colspan="2" width="105">
<p><span style="font-size: 18px">分类</span></p>
</td>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">简称</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">全称</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">中文名</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">作用</span></p>
</td>
</tr>
<tr>
<td style="width: 7.03218%" rowspan="8" width="42">
<p><span style="font-size: 18px">通用*8</span></p>
</td>
<td style="width: 10.2503%" rowspan="4" width="63">
<p><span style="font-size: 18px">数据*4</span></p>
</td>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">AX-AH/AL</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">accumulator</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">累加器</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">乘除、IO</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">BX-BH/BL</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">base</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">基地址</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">寻址</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">CX-CH/CL</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">count</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">计数</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">循环、字符串</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">DX-DH/DL</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">data</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">数据</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">乘除、间接IO</span></p>
</td>
</tr>
<tr>
<td style="width: 10.2503%" rowspan="4" width="63">
<p><span style="font-size: 18px">指针*2</span></p>
<p><span style="font-size: 18px">变址*2</span></p>
</td>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">BP</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">base pointer</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">基指针</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">寻址</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">SP</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">stack pointer</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">栈指针</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">寻址</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">SI</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">source index</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">源变址</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">字符串</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">DI</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">destination index</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">目的变址</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">字符串</span></p>
</td>
</tr>
<tr>
<td style="width: 17.2825%" colspan="2" rowspan="2" width="105">
<p><span style="font-size: 18px">控制*4</span></p>
</td>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">IP</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">instruction pointer</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">指令指针</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">指令寻址</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">FLAG</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">flag</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">标志</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">运算结果特征</span></p>
</td>
</tr>
<tr>
<td style="width: 17.2825%" colspan="2" rowspan="4" width="105">
<p><span style="font-size: 18px">段*4</span></p>
</td>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">CS</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">code segment</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">代码段</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">配合IP,寻址代码</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">SS</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">stack segment</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">栈段</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">配合SP,寻址栈</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">DS</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">data segment</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">数据段</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">存放操作数、中间结果</span></p>
</td>
</tr>
<tr>
<td style="width: 15.2527%" width="75">
<p><span style="font-size: 18px">ES</span></p>
</td>
<td style="width: 25.0333%" width="130">
<p><span style="font-size: 18px">extra segment</span></p>
</td>
<td style="width: 17.9976%" width="119">
<p><span style="font-size: 18px">附加段</span></p>
</td>
<td style="width: 24.4338%" width="182">
<p><span style="font-size: 18px">存放处理后的数据</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">说明:</span></p>
<ul>
<li><span style="font-size: 18px">通用寄存器:专门用途+通用用途(数据传送、数据暂存);</span></li>
<li><span style="font-size: 18px">SS:SP组:SP必须和 SS 一起使用,在任何时刻,SS:SP都是指向栈顶元素;</span></li>
<li><span style="font-size: 18px">CS:IP组:两个寄存器指示了 CPU 当前将要读取的指令的地址;</span></li>
<li><span style="font-size: 18px">8086中,只有4个寄存器能以[…]&nbsp;的方式使用,分别是 BX、SI、DI和BP;</span></li>
<li><span style="font-size: 18px">默认段为SS,,, 默认段DS;</span></li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size: 18px">FLAG标志位*9</span></p>
<table style="border-collapse: collapse; background-color: rgba(194, 224, 244, 1)">
<tbody>
<tr>
<td width="98">
<p><span style="font-size: 18px">分类</span></p>
</td>
<td width="84">
<p><span style="font-size: 18px">位置</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">简称</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">全称</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">中文名</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">作用</span></p>
</td>
</tr>
<tr>
<td rowspan="6" width="98">
<p><span style="font-size: 18px">状态类*6</span></p>
</td>
<td width="84">
<p><span style="font-size: 18px">0</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">CF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">carry flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">进位标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">加减、移位、循环</span></p>
</td>
</tr>
<tr>
<td width="84">
<p><span style="font-size: 18px">2</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">PF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">parity flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">奇偶标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">错误检查</span></p>
</td>
</tr>
<tr>
<td width="84">
<p><span style="font-size: 18px">4</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">AF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">auxiliary carry flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">辅助进位标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">BCD码运算</span></p>
</td>
</tr>
<tr>
<td width="84">
<p><span style="font-size: 18px">6</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">ZF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">zero flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">零标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">结果判断、控制转移</span></p>
</td>
</tr>
<tr>
<td width="84">
<p><span style="font-size: 18px">7</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">SF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">sign flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">符号标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">结果判断、控制转移</span></p>
</td>
</tr>
<tr>
<td width="84">
<p><span style="font-size: 18px">11</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">OF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">overflow flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">溢出标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">结果判断</span></p>
</td>
</tr>
<tr>
<td rowspan="3" width="98">
<p><span style="font-size: 18px">控制类*3</span></p>
</td>
<td width="84">
<p><span style="font-size: 18px">8</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">TF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">trap flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">陷阱标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">调试</span></p>
</td>
</tr>
<tr>
<td width="84">
<p><span style="font-size: 18px">9</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">IF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">interrupt flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">中断标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">控制可屏蔽中断</span></p>
</td>
</tr>
<tr>
<td width="84">
<p><span style="font-size: 18px">10</span></p>
</td>
<td width="50">
<p><span style="font-size: 18px">DF</span></p>
</td>
<td width="155">
<p><span style="font-size: 18px">direction flag</span></p>
</td>
<td width="141">
<p><span style="font-size: 18px">方向标志</span></p>
</td>
<td width="182">
<p><span style="font-size: 18px">字符串步进方向</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">什么是指令?</span></p>
<p><span style="font-size: 18px"><img src="https://img2022.cnblogs.com/blog/2710778/202207/2710778-20220708154522691-1340783405.png"></span></p>
<p><span style="font-size: 18px">去哪里找操作数?</span></p>
<p><span style="font-size: 18px"><img src="https://img2022.cnblogs.com/blog/2710778/202207/2710778-20220708153953978-32264701.png"></span></p>
<p><span style="font-size: 18px">寻址方式*4</span></p>
<table style="border-collapse: collapse; background-color: rgba(236, 202, 250, 1)">
<tbody>
<tr>
<td width="24.9800%">
<p><span style="font-size: 18px">寻址方式</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">操作数</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">寻址</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">举例</span></p>
</td>
</tr>
<tr>
<td width="24.9800%">
<p><span style="font-size: 18px">立即数寻址</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">操作数就是立即数</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">--</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">MOV AX,8086H</span></p>
</td>
</tr>
<tr>
<td width="24.9800%">
<p><span style="font-size: 18px">寄存器寻址</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">操作数在寄存器中</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">用寄存器名寻址</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">MOV AX,BX</span></p>
</td>
</tr>
<tr>
<td width="24.9800%">
<p><span style="font-size: 18px">内存寻址</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">操作数在内存中</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">用物理地址寻址</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">见下表</span></p>
</td>
</tr>
<tr>
<td rowspan="2" width="24.9800%">
<p><span style="font-size: 18px">I/O端口寻址</span></p>
</td>
<td rowspan="2" width="25.0000%">
<p><span style="font-size: 18px">操作数在IO设备中</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">立即数作为地址</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">IN AL,25H</span></p>
</td>
</tr>
<tr>
<td width="25.0000%">
<p><span style="font-size: 18px">地址存入寄存器</span></p>
</td>
<td width="25.0000%">
<p><span style="font-size: 18px">MOV DX,285H</span></p>
<p><span style="font-size: 18px">OUT DX,AL</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">内存寻址*5</span></p>
<table style="border-collapse: collapse; background-color: rgba(236, 202, 250, 1)">
<tbody>
<tr>
<td width="17.2400%">
<p><span style="font-size: 18px">寻址方式</span></p>
</td>
<td width="28.2600%">
<p><span style="font-size: 18px">有效地址EA</span></p>
</td>
<td width="27.2400%">
<p><span style="font-size: 18px">默认段</span></p>
</td>
<td width="27.2400%">
<p><span style="font-size: 18px">举例</span></p>
</td>
</tr>
<tr>
<td width="17.2400%">
<p><span style="font-size: 18px">直接寻址</span></p>
</td>
<td width="28.2600%">
<p><span style="font-size: 18px">EA=IMME</span></p>
</td>
<td width="27.2400%">
<p><span style="font-size: 18px">默认段DS</span></p>
</td>
<td width="27.2400%">
<p><span style="font-size: 18px">MOV AX,</span></p>
</td>
</tr>
<tr>
<td width="17.2400%">
<p><span style="font-size: 18px">寄存器间接寻址</span></p>
</td>
<td width="28.2600%">
<p><span style="font-size: 18px">EA=(REG)</span></p>
</td>
<td rowspan="2" width="27.2400%">
<p><span style="font-size: 18px">REG:BX/SI/DI、BP;</span></p>
<p><span style="font-size: 18px">BX/SI/DI默认DS,BP默认SS;</span></p>
</td>
<td width="27.2400%">
<p><span style="font-size: 18px">MOV AX,</span></p>
</td>
</tr>
<tr>
<td width="17.2400%">
<p><span style="font-size: 18px">寄存器相对间接寻址</span></p>
</td>
<td width="28.2600%">
<p><span style="font-size: 18px">EA=(REG)+IMME</span></p>
</td>
<td width="27.2400%">
<p><span style="font-size: 18px">MOV AX,</span></p>
</td>
</tr>
<tr>
<td width="17.2400%">
<p><span style="font-size: 18px">基址变址寻址</span></p>
</td>
<td width="28.2600%">
<p><span style="font-size: 18px">EA=(基REG)+(变REG)</span></p>
</td>
<td rowspan="2" width="27.2400%">
<p><span style="font-size: 18px">基REG:BX/BP,变REG:SI/DI</span></p>
<p><span style="font-size: 18px">BX默认DS,BP默认SS</span></p>
</td>
<td width="27.2400%">
<p><span style="font-size: 18px">MOV AX,</span></p>
</td>
</tr>
<tr>
<td width="17.2400%">
<p><span style="font-size: 18px">相对基址变址寄存器</span></p>
</td>
<td width="28.2600%">
<p><span style="font-size: 18px">EA=(基REG)+(变REG)+IMME</span></p>
</td>
<td width="27.2400%">
<p><span style="font-size: 18px">MOV AX,</span></p>
</td>
</tr>
<tr>
<td colspan="3" width="72.7400%">
<p><span style="font-size: 18px">IMME作为地址时,可以8位或16位;物理地址PA=SA*10H+EA;</span></p>
</td>
<td width="27.2400%">
<p>&nbsp;</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p id="1657104353243"></p>
<p><span style="font-size: 18px">寄存器命名的演化</span></p>
<table style="border-collapse: collapse; background-color: rgba(191, 237, 210, 1)">
<tbody>
<tr>
<td width="336">
<p><span style="font-size: 18px">处理器</span></p>
</td>
<td width="82">
<p><span style="font-size: 18px">年份</span></p>
</td>
<td width="471">
<p><span style="font-size: 18px">寄存器名称演化</span></p>
</td>
</tr>
<tr>
<td width="336">
<p><span style="font-size: 18px">8008-世界上第一个8位微处理器</span></p>
</td>
<td width="82">
<p><span style="font-size: 18px">1972年</span></p>
</td>
<td width="471">
<p><span style="font-size: 18px">A B C D E H L</span></p>
</td>
</tr>
<tr>
<td width="336">
<p><span style="font-size: 18px">8086-16位微处理器</span></p>
</td>
<td width="82">
<p><span style="font-size: 18px">1979年</span></p>
</td>
<td width="471">
<p><span style="font-size: 18px">AX BX CX DX AL BL CL DL AH BH CH DH</span></p>
</td>
</tr>
<tr>
<td width="336">
<p><span style="font-size: 18px">80386-x86系列中的第一个32位处理器</span></p>
</td>
<td width="82">
<p><span style="font-size: 18px">1985年</span></p>
</td>
<td width="471">
<p><span style="font-size: 18px">EAX AX AH AL</span></p>
</td>
</tr>
<tr>
<td width="336">
<p><span style="font-size: 18px">x86-64</span></p>
</td>
<td width="82">
<p><span style="font-size: 18px">2003年</span></p>
</td>
<td width="471">
<p><span style="font-size: 18px">RAX EAX AX AH AL</span></p>
</td>
</tr>
<tr>
<td width="336">
<p><span style="font-size: 18px">x86-64</span></p>
</td>
<td width="82">
<p><span style="font-size: 18px">NOW</span></p>
</td>
<td width="471">
<p><span style="font-size: 18px">R15(64) R15D(32) R15W(16) R15B(8)</span></p>
</td>
</tr>
</tbody>
</table>
<ul>
<li><span style="font-size: 18px">A=accumulator=累加器,B=base基础,C=Count=计数,D=Data=数据,</span></li>
<li><span style="font-size: 18px">X表示H和L的结合,表示完整的16位,只是随便挑了一个字母X,没有实际含义;</span></li>
<li><span style="font-size: 18px">H=high=高8位,L=low=低8位,E=extend=扩展,R=register=寄存器</span></li>
<li><span style="font-size: 18px">D=double word=双字(32位),W=word=字(16位),B=byte=字节(8位)</span></li>
</ul>
<p><span style="font-size: 18px">物理地址=段地址*16+偏移地址</span></p>
<p><span style="font-size: 18px">默认组合</span></p>
<table style="border-collapse: collapse; background-color: rgba(251, 238, 184, 1)">
<tbody>
<tr>
<td width="200">
<p><span style="font-size: 18px">SS:SP</span></p>
</td>
<td width="304">
<p><span style="font-size: 18px">栈段地址+栈指针</span></p>
</td>
</tr>
<tr>
<td width="200">
<p><span style="font-size: 18px">SS:BP</span></p>
</td>
<td width="304">
<p><span style="font-size: 18px">栈段地址+基指针</span></p>
</td>
</tr>
<tr>
<td width="200">
<p><span style="font-size: 18px">DS:SI</span></p>
</td>
<td width="304">
<p><span style="font-size: 18px">数据段地址+源变址</span></p>
</td>
</tr>
<tr>
<td width="200">
<p><span style="font-size: 18px">ES:DI</span></p>
</td>
<td width="304">
<p><span style="font-size: 18px">附加段地址+目标变址</span></p>
</td>
</tr>
<tr>
<td width="200">
<p><span style="font-size: 18px">CS:IP</span></p>
</td>
<td width="304">
<p><span style="font-size: 18px">代码段地址+指令指针</span></p>
</td>
</tr>
<tr>
<td width="200">
<p><span style="font-size: 18px"><strong>DS:BX</strong></span></p>
</td>
<td width="304">
<p><span style="font-size: 18px"><strong>数据段地址+基数</strong></span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">寄存器*14</span></p>
<table style="border-collapse: collapse; background-color: rgba(248, 202, 198, 1)">
<tbody>
<tr>
<td width="168">
<p><span style="font-size: 18px">通用*4(ABCD)</span></p>
</td>
<td width="354">
<p><span style="font-size: 18px">Accumulate+Base+Count+Data</span></p>
</td>
<td width="367">
<p><span style="font-size: 18px">ACD(数据)B(地址)</span></p>
</td>
</tr>
<tr>
<td width="168">
<p><span style="font-size: 18px">段*4(CDES)</span></p>
</td>
<td width="354">
<p><span style="font-size: 18px">Code+Data+Extra+Stack</span></p>
</td>
<td width="367">
<p><span style="font-size: 18px">CDES(地址)</span></p>
</td>
</tr>
<tr>
<td width="168">
<p><span style="font-size: 18px">指针*3(SBI)</span></p>
</td>
<td width="354">
<p><span style="font-size: 18px">Stack+Base+Instruction</span></p>
</td>
<td width="367">
<p><span style="font-size: 18px">SBI(地址)</span></p>
</td>
</tr>
<tr>
<td width="168">
<p><span style="font-size: 18px">变址*2(SD)</span></p>
</td>
<td width="354">
<p><span style="font-size: 18px">Source+Destination</span></p>
</td>
<td width="367">
<p><span style="font-size: 18px">SD(地址)</span></p>
</td>
</tr>
<tr>
<td width="168">
<p><span style="font-size: 18px">标志*1 Flag/PSW</span></p>
</td>
<td width="354">
<p><span style="font-size: 18px">program status word</span></p>
</td>
<td width="367">
<p><span style="font-size: 18px">Flag(状态)</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="font-size: 18px">指令分类</span></p>
<table style="border-collapse: collapse; width: 68.4679%; height: 289.313px; background-color: rgba(191, 237, 210, 1)">
<tbody>
<tr style="height: 48.2188px">
<td style="width: 25.7198%; height: 48.2188px" width="230">
<p><span style="font-size: 18px">一、数据传送指令</span></p>
</td>
<td style="width: 74.2802%; height: 48.2188px" width="660">
<p><span style="font-size: 18px">MOV,PUSH,POP,XCHG,IN,OUT,XLAT,LEA,LDS,LES,LAHF,SAHF,PUSHF,POPF</span></p>
</td>
</tr>
<tr style="height: 48.2188px">
<td style="width: 25.7198%; height: 48.2188px" width="230">
<p><span style="font-size: 18px">二、算术指令</span></p>
</td>
<td style="width: 74.2802%; height: 48.2188px" width="660">
<p><span style="font-size: 18px">ADD,ADC,INC,SUB,SBB,DEC,NEG,CMP,MUL,IMUL,DIV,IDIV,CBW,CWD</span></p>
</td>
</tr>
<tr style="height: 48.2188px">
<td style="width: 25.7198%; height: 48.2188px" width="230">
<p><span style="font-size: 18px">三、逻辑指令</span></p>
</td>
<td style="width: 74.2802%; height: 48.2188px" width="660">
<p><span style="font-size: 18px">AND,OR,XOR,TEST,NOT,SHL/SHR,SAL/SAR,ROL/ROR,RCL/RCR</span></p>
</td>
</tr>
<tr style="height: 48.2188px">
<td style="width: 25.7198%; height: 48.2188px" width="230">
<p><span style="font-size: 18px">四、串处理指令</span></p>
</td>
<td style="width: 74.2802%; height: 48.2188px" width="660">
<p><span style="font-size: 18px">MOVS,LODS,STOS,CMPS,SCAS</span></p>
</td>
</tr>
<tr style="height: 48.2188px">
<td style="width: 25.7198%; height: 48.2188px" width="230">
<p><span style="font-size: 18px">五、控制转移指令</span></p>
</td>
<td style="width: 74.2802%; height: 48.2188px" width="660">
<p><span style="font-size: 18px">JMP,...,LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE,CALL,RET,INT,INTO,IRET</span></p>
</td>
</tr>
<tr style="height: 48.2188px">
<td style="width: 25.7198%; height: 48.2188px" width="230">
<p><span style="font-size: 18px">六、处理机控制指令</span></p>
</td>
<td style="width: 74.2802%; height: 48.2188px" width="660">
<p>&nbsp;</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="font-size: 18px">语言组成</span></p>
<table style="border-collapse: collapse; background-color: rgba(251, 238, 184, 1)">
<tbody>
<tr>
<td width="296">
<p><span style="font-size: 18px">①标号</span></p>
</td>
<td width="296">
<p><span style="font-size: 18px">表示指令地址或变量地址</span></p>
<p><span style="font-size: 18px">start:mov ax,bx</span></p>
</td>
</tr>
<tr>
<td width="296">
<p><span style="font-size: 18px">②助记符</span></p>
</td>
<td width="296">
<p><span style="font-size: 18px">机器指令的符号化表示jmp</span></p>
</td>
</tr>
<tr>
<td width="296">
<p><span style="font-size: 18px">③操作数</span></p>
</td>
<td width="296">
<p><span style="font-size: 18px">add ax,250H</span></p>
</td>
</tr>
<tr>
<td width="296">
<p><span style="font-size: 18px">④注释</span></p>
</td>
<td width="296">
<p><span style="font-size: 18px">单行注释;多行注释comment</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px">堆栈&nbsp; heap+stack</span></p>
<table style="border-collapse: collapse; background-color: rgba(191, 237, 210, 1)">
<tbody>
<tr>
<td width="445">
<p><span style="font-size: 18px">堆=heap</span></p>
</td>
<td width="445">
<p><span style="font-size: 18px">栈=stack</span></p>
</td>
</tr>
<tr>
<td width="445">
<p><span style="font-size: 18px">人为申请开辟malloc</span></p>
</td>
<td width="445">
<p><span style="font-size: 18px">系统自动分配</span></p>
</td>
</tr>
<tr>
<td width="445">
<p><span style="font-size: 18px">手动释放free</span></p>
</td>
<td width="445">
<p><span style="font-size: 18px">编译器自动释放</span></p>
</td>
</tr>
<tr>
<td width="445">
<p><span style="font-size: 18px">空间较大</span></p>
</td>
<td width="445">
<p><span style="font-size: 18px">空间较小,栈的大小是1M</span></p>
</td>
</tr>
<tr>
<td width="445">
<p><span style="font-size: 18px">速度比较慢</span></p>
</td>
<td width="445">
<p><span style="font-size: 18px">速度较快</span></p>
</td>
</tr>
<tr>
<td width="445">
<p><span style="font-size: 18px">不连续的空间,产生碎片</span></p>
</td>
<td width="445">
<p><span style="font-size: 18px">连续的空间,不会产生碎片</span></p>
</td>
</tr>
<tr>
<td width="445">
<p><span style="font-size: 18px">链表数据结构存储空闲内存地址</span></p>
</td>
<td width="445">
<p><span style="font-size: 18px">栈是机器系统提供的数据结构,</span></p>
<p><span style="font-size: 18px">专门的寄存器存储地址</span></p>
</td>
</tr>
<tr>
<td width="445">
<p><span style="font-size: 18px">堆一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排</span></p>
</td>
<td width="445">
<p><span style="font-size: 18px">栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数的各个参数进栈,其中静态变量是不入栈的</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18px"><img src="https://img2022.cnblogs.com/blog/2710778/202207/2710778-20220705111159975-938484901.png"></span></p>
<p><span style="font-size: 18px"><img src="https://img2022.cnblogs.com/blog/2710778/202207/2710778-20220708183356536-1226580713.png"></span></p>
<p><span style="font-size: 18px"><strong>汇编语言</strong></span></p>
<h1><span style="font-size: 18px"><strong>基础</strong></span></h1>
<h2><span style="font-size: 18px">字和字节</span></h2>
<h3><span style="font-size: 18px">字节=byte=8位=8bit字=word=2字节=16位字=高位字节+低位字节</span></h3>
<h2><span style="font-size: 18px">进制</span></h2>
<h3><span style="font-size: 18px">十六进制=H=hexadecimal,如AE20H二进制=B=binary,如1010100B十进制=D=decimal,如8866D</span></h3>
<h3><span style="font-size: 18px">H=hex=hexadecimal/ˌheksəˈdesɪml/O=oct=octonary英 /ˈɒktənəri/</span></h3>
<h2><span style="font-size: 18px">指令集</span></h2>
<h3><span style="font-size: 18px">处理器能识别的指令的集合叫做指令集形式:二进制编码</span></h3>
<h3><span style="font-size: 18px">(1) 算术运算指令和逻辑运算指令(2) 数据传送指令数据传送指令是寄存器与寄存器之间、处理器与内存之间、处理器与硬盘之间等的数据传送(3) 处理器状态控制指令</span></h3>
<h3><span style="font-size: 18px">机器指令=机器码=电平信息</span></h3>
<h2><span style="font-size: 18px">大小写</span></h2>
<h3><span style="font-size: 18px">汇编语言不区分大小写,MOV等价于mov</span></h3>
<h2><span style="font-size: 18px">机器语言</span></h2>
<h3><span style="font-size: 18px">机器指令的集合</span></h3>
<h3><span style="font-size: 18px">一台机器可以正确执行的命令</span></h3>
<h3><span style="font-size: 18px">机器指令是一系列二进制数,计算机将其转化为一系列高低电平,使计算机的电子器件受到驱动,从而进行运算</span></h3>
<h2><span style="font-size: 18px">指令和数据</span></h2>
<h3><span style="font-size: 18px">在存储上,指令和数据没有区别,一段内存上存储的内容既可以作为指令也可以作为数据;</span></h3>
<h3><span style="font-size: 18px">指令的数据的不同体现在应用上,把他当做指令来用,它才成为指令,把他当做数据来用,他才是数据</span></h3>
<h2><span style="font-size: 18px">数据读写</span></h2>
<h3><span style="font-size: 18px">①存储单元的地址(地址信息)②器件选择,读写命令(控制信息)③读写的数据(数据信息)</span></h3>
<ul>
<li><span style="font-size: 18px">①地址信息-地址总线②控制信息-控制总线③数据信息-数据总线</span></li>
</ul>
<h3><span style="font-size: 18px">总线=数据线=导线=一根根导线的集合①地址总线的宽度决定了寻址能力2^n②控制总线的宽度决定了对其他器件的控制能力③数据总线的宽度决定了一次数据传送量</span></h3>
<h2><span style="font-size: 18px">硬件</span></h2>
<h3><span style="font-size: 18px">随机存储器RAM</span></h3>
<ul>
<li><span style="font-size: 18px">可读可写</span></li>
<li><span style="font-size: 18px">必须带电存储,关机后内容消失</span></li>
</ul>
<h3><span style="font-size: 18px">只读存储器ROM</span></h3>
<ul>
<li><span style="font-size: 18px">只读不写</span></li>
<li><span style="font-size: 18px">关机后内容不会消失</span></li>
</ul>
<h3><span style="font-size: 18px">BIOS=basic input output system基本输入输出系统</span></h3>
<h1><span style="font-size: 18px"><strong>寻址</strong></span></h1>
<h2><span style="font-size: 18px">分类</span></h2>
<h3><span style="font-size: 18px">操作数寻址*7</span></h3>
<ul>
<li><span style="font-size: 18px">立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址</span></li>
</ul>
<h3><span style="font-size: 18px">I/O端口寻址*2</span></h3>
<ul>
<li><span style="font-size: 18px">直接端口寻址、间接端口寻址</span></li>
</ul>
<h3><span style="font-size: 18px">存储器寻址*5</span></h3>
<ul>
<li><span style="font-size: 18px">直接寻址</span></li>
<li><span style="font-size: 18px">直接寻址,指令中直接给出操作数的有效地址MOV AX, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PA=DS*10H+0002H</span></li>
<li><span style="font-size: 18px">8086指令系统规定,存储器直接寻址时如果不指定段寄存器,默认就在数据段DS</span></li>
<li><span style="font-size: 18px">如果操作数在默认段意外的其他段,则必须在地址前加以说明,这种说明叫【段超越前缀】段超越前缀=不使用默认段=指定段</span></li>
<li><span style="font-size: 18px">寄存器间接寻址</span></li>
<li><span style="font-size: 18px">指令中给出寄存器,而寄存器中存储的是操作数的有效地址MOV AX, &nbsp;&nbsp;&nbsp;&nbsp;PA=(DS)*10+(BX)</span></li>
<li><span style="font-size: 18px">若果指令中指定的存放有效地址的寄存器是BX、SI、DI,那么默认段就是DS</span></li>
<li><span style="font-size: 18px">寄存器相对寻址</span></li>
<li><span style="font-size: 18px">指令中给定一个寄存器和一个相对偏移量(8位/16位),两者之和左右操作数的有效地址</span></li>
<li><span style="font-size: 18px">MOV AX, &nbsp;&nbsp;&nbsp;EA=(BX)+10H &nbsp;&nbsp;&nbsp;PA=(DS)*10H+EA这里的BX也叫做【间址】寄存器,就是说BX给出的地址本身并不是有效地址,而是一个间接地址</span></li>
<li><span style="font-size: 18px">BX、SI、DI作为间址寄存器,默认数据段寄存器位DSBP作为间址寄存器时,默认栈段寄存器为SS</span></li>
<li><span style="font-size: 18px">有效地址EA=(R)+偏移量OFFSET(8位或16位)物理地址:PA=(DS)*10H+EA &nbsp;&nbsp;&nbsp;BX、SI、DI作为间址寄存器PA=(SS)*10H+EA &nbsp;&nbsp;&nbsp;&nbsp;BP作为间址寄存器</span></li>
<li><span style="font-size: 18px">基址变址寻址</span></li>
<li><span style="font-size: 18px">指令中给出一个基址寄存器和一个变址寄存器,二者内容之和作为操作数的有效地址MOV AX, &nbsp;&nbsp;EA=(BX)+(SI) &nbsp;&nbsp;PA=(DS)*10H+EA</span></li>
<li><span style="font-size: 18px">基址寄存器可取BX或BP,变址寄存器可取SI或DI指令中不能同时出现两个基址寄存器或两个变址寄存器</span></li>
<li><span style="font-size: 18px">如果基址寄存器为BX,默认数据段寄存器DS如果基址寄存器为BP,默认代码段寄存器SS</span></li>
<li><span style="font-size: 18px">BX+SI &nbsp;BX+DI &nbsp;√ &nbsp;&nbsp;默认DS段BP+SI &nbsp;BP+DI &nbsp;√ &nbsp;&nbsp;默认SS段BX+BP SI+DI &nbsp;&nbsp;× &nbsp;&nbsp;错误的组合</span></li>
<li><span style="font-size: 18px">相对基址变址寻址</span></li>
<li><span style="font-size: 18px">指令中给出一个基址寄存器、一个变址寄存器和 一个相对偏移量(8位或16位),3者之和作为操作数的有效地址</span></li>
<li><span style="font-size: 18px">MOV AX,EA=(BX)+(DI)+0050HPA=(DS)*10H+EA</span></li>
<li><span style="font-size: 18px">基址寄存器可取BX或BP,变址寄存器可取SI或DI指令中不能同时出现两个基址寄存器或两个变址寄存器</span></li>
<li><span style="font-size: 18px">如果基址寄存器为BX,默认数据段寄存器DS如果基址寄存器为BP,默认代码段寄存器SS</span></li>
</ul>
<h3><span style="font-size: 18px">I/O端口寻址</span></h3>
<ul>
<li><span style="font-size: 18px">直接端口寻址</span></li>
<li><span style="font-size: 18px">在指令中直接给出要访问的端口地址,范围范围0-255一般采用2位16进制数表示,也可以用符号表示</span></li>
<li><span style="font-size: 18px">IN AL,25H &nbsp;&nbsp;&nbsp;从25H端口取数据送入AL</span></li>
<li><span style="font-size: 18px">间接端口寻址</span></li>
<li><span style="font-size: 18px">若访问端口地址&gt;255,则必须采用间接端口寻址,访问范围0-65535先将端口地址送入DX寄存器,用DX作为间接寻址寄存器</span></li>
<li><span style="font-size: 18px">MOV DX,285H &nbsp;&nbsp;&nbsp;将端口地址285H送入DX寄存器OUT DX,AL &nbsp;&nbsp;&nbsp;将AL中的数据输出到DX指定端口</span></li>
</ul>
<h3><span style="font-size: 18px">立即数寻址</span></h3>
<ul>
<li><span style="font-size: 18px">将操作数直接放在指令中,并紧跟在代码之后,就叫立即数寻址;立即数只能作为源操作数,不能作为目的操作数,一般用来给寄存器赋值;立即数寻址速度快;8086支持2进制、10进制16进制的立即数;10进制可以不指定后缀(D/d),2进制必须指定后缀B/b,16进制必须指定后缀H/h;</span></li>
</ul>
<h3><span style="font-size: 18px">寄存器寻址</span></h3>
<ul>
<li><span style="font-size: 18px">操作数存放于寄存器中,通过指定寄存器名称,来获取寄存器的数据,叫做寄存器寻址;可采用的寄存器名:AL/AH/BL/BH/CL/CH/DL/DH,AX/BX/CX/DX/BP/SP/SI/DI寄存器寻址在CPU内部进行,不需要总线周期,速度快;寄存器寻址可用于源操作数,也可用于目的操作数,或者同时用于二者;</span></li>
</ul>
<h3><span style="font-size: 18px">存储器寻址</span></h3>
<ul>
<li><span style="font-size: 18px">由于寄存器数量有限,因此程序中大多数操作数需要从内存中获得;内存寻址最终将得到存放操作数的物理地址;</span></li>
</ul>
<h2><span style="font-size: 18px">定义</span></h2>
<h3><span style="font-size: 18px">&nbsp;&nbsp;&nbsp;&nbsp;</span></h3>
<h3><span style="font-size: 18px">【寻址】指令指定操作数的位置,即给出地址信息,在执行时需要根据这个地址信息找到需要的操作数,这种寻找操作数的过程称为寻址;【寻址方式】就是寻找操作数或操作数地址的方式;</span></h3>
<h1><span style="font-size: 18px"><strong>指令</strong></span></h1>
<h2><span style="font-size: 18px">分类</span></h2>
<h3><span style="font-size: 18px">汇编指令</span></h3>
<ul>
<li><span style="font-size: 18px">汇编指令是机器指令便于记忆的书写格式;</span></li>
<li><span style="font-size: 18px">汇编指令是机器指令的助记符,有对应的机器指令;</span></li>
<li><span style="font-size: 18px">汇编语言的核心是汇编指令,它决定了汇编语言的特性</span></li>
</ul>
<h3><span style="font-size: 18px">伪指令</span></h3>
<ul>
<li><span style="font-size: 18px">没有对应的机器指令,由编译器执行,计算机并不执行</span></li>
</ul>
<h3><span style="font-size: 18px">其他符号</span></h3>
<ul>
<li><span style="font-size: 18px">+-*/等,由编译器识别,没有对应的机器指令</span></li>
</ul>
<h2><span style="font-size: 18px">伪指令</span></h2>
<h3><span style="font-size: 18px">分段指令:一个汇编程序是由若干个段segment组成的;segname segment......segname &nbsp;endssegment=start of code segmen=代码段的开始位置,ends=end of code segmen=代码段的结束位置</span></h3>
<h3><span style="font-size: 18px">end是一个汇编程序结束的标志,而ends是一个代码段结束的标志;end应该在程序末尾单独使用,而ends必须和segment配对使用</span></h3>
<h3><span style="font-size: 18px">assume假设假设某个寄存器和某个程序段相关联;assume segname</span></h3>
<h2><span style="font-size: 18px">组成</span></h2>
<h3><span style="font-size: 18px">指令(instruction)是一种语句,它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行。一条指令有四个组成部分:①标号(可选)----表示指令地址或变量地址②指令助记符(必需)③操作数(通常是必需的)④注释(可选)不同部分的位置安排如下所示: mnemonic [;comment]</span></h3>
<h3><span style="font-size: 18px">标号(label)是一种标识符,是指令和数据的位置标记。标号位于指令的前端,表示指令的地址。同样,标号也位于变量的前端,表示变量的地址。标号有两种类型:数据标号和代码标号。数据标号标识变量的位置,它提供了一种方便的手段在代码中引用该变量。比如,下面定义了一个名为 count 的变量:count DWORD 100array DWORD 1024, 2048 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD 4096, 8192</span></h3>
<h3><span style="font-size: 18px">指令助记符(instruction mnemonic)是标记一条指令的短单词。在英语中,助记符是帮助记忆的方法。相似地,汇编语言指令助记符,如 mov, add 和 sub,给出了指令执行操作类型的线索。</span></h3>
<h3><span style="font-size: 18px">操作数操作数是指令输入输出的数值。汇编语言指令操作数的个数范围是 0〜3 个,每个操作数可以是寄存器、内存操作数、整数表达式和输入输岀端口。生成内存操作数有不同的方法,比如,使用变量名、带方括号的寄存器等。变量名暗示了变量地址,并指示计算机使用给定地址的内存内容。</span></h3>
<h3><span style="font-size: 18px">注释注释是程序编写者与阅读者交流程序设计信息的重要途径。程序清单的开始部分通常包含如下信息:程序目标的说明程序创建者或修改者的名单程序创建和修改的日期程序实现技术的说明注释有两种指定方法:①单行注释,用分号(;)开始。汇编器将忽略在同一行上分号之后的所有字符。②块注释,用 COMMENT 伪指令和一个用户定义的符号开始。汇编器将忽略其后所有的文本行,直到相同的用户定义符号出现为止。</span></h3>
<h3><span style="font-size: 18px">NOP(空操作)指令最安全(也是最无用)的指令是 NOP(空操作)。它在程序空间中占有一个字节,但是不做任何操作。它有时被编译器和汇编器用于将代码对齐到有效的地址边界。在下面的例子中,第一条指令 MOV 生成了 3 字节的机器代码。NOP 指令就把第三条指令的地址对齐到双字边界(4 的偶数倍):00000000 &nbsp;&nbsp;66 &nbsp;&nbsp;8B &nbsp;C3 &nbsp;mov ax,bx00000003 &nbsp;&nbsp;90 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;对齐下条指令00000004 &nbsp;&nbsp;8B &nbsp;&nbsp;D1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov edx,ecxx86 处理器被设计为从双字的偶数倍地址处加载代码和数据,这使得加载速度更快。</span></h3>
<h2><span style="font-size: 18px">分类</span></h2>
<h3><span style="font-size: 18px">&nbsp;​一、数据传送指令​​&nbsp;: &nbsp;​MOV,PUSH,POP,XCHG,IN,OUT,XLAT,LEA,LDS,LES,LAHF,SAHF,PUSHF,POPF​​&nbsp;​二、算术指令​​&nbsp;: ​ADD,ADC,INC,SUB,SBB,DEC,NEG,CMP,MUL,IMUL,DIV,IDIV,CBW,CWD​​​&nbsp;​三、逻辑指令​​&nbsp;: ​AND,OR,XOR,TEST,NOT,SHL/SHR,SAL/SAR,ROL/ROR,RCL/RCR​​&nbsp;​四、串处理指令​​&nbsp;:​ MOVS,LODS,STOS,CMPS,SCAS​​&nbsp;​五、控制转移指令​​&nbsp;:&nbsp;​JMP,...,LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE,CALL,RET,INT,INTO,IRET​​&nbsp;​六、处理机控制指令。​</span></h3>
<h1><span style="font-size: 18px"><strong>指令+</strong></span></h1>
<h2><span style="font-size: 18px">数据传送指令</span></h2>
<h3><span style="font-size: 18px">定义</span></h3>
<ul>
<li><span style="font-size: 18px">可以修改IP或者同时修改CS和IP的指令称为转移指令;转移指令就是控制CPU执行某行代码的指令;</span></li>
</ul>
<h3><span style="font-size: 18px">分类</span></h3>
<ul>
<li><span style="font-size: 18px">只修改IP时,称为段内转移;如jmp ax同时修改CS和IP,称为段间转移,如jmp 10000:0</span></li>
<li><span style="font-size: 18px">段内转移分为短转移和长转移:短转移:IP修改范围-128~127,长转移:IP修改范围-32768~32767</span></li>
<li><span style="font-size: 18px">①无条件转移,如jmp②条件转移③循环转移,如loop④过程、⑤中断</span></li>
</ul>
<h3><span style="font-size: 18px">分组</span></h3>
<ul>
<li><span style="font-size: 18px">通用数据传送</span></li>
<li><span style="font-size: 18px">MOV dst src &nbsp;字节或字传送执行指令后,src内容不变,dst和src内容相同源操作数可以是:通用寄存器、段寄存器、存储器、立即数目标操作数可以是:通用寄存器、段寄存器(CS除外)、存储器■ &nbsp;&nbsp;目的操作数不能用立即数寻址IMME■ &nbsp;&nbsp;目的操作数不能用代码段寄存器CS■ &nbsp;&nbsp;源操作数和目的操作数不能同时为存储器MEM■ &nbsp;&nbsp;两个段寄存器之间不能直接传送数据</span></li>
<li><span style="font-size: 18px">PUSH src &nbsp;字入栈 &nbsp;不能使用立即数作为PUSH操作数通用寄存器、段寄存器、存储器可以作为操作数</span></li>
<li><span style="font-size: 18px">POP dst 字出栈操作数必须为16位,且不能是立即数通用寄存器、段寄存器、存储器可以作为操作数</span></li>
<li><span style="font-size: 18px">XCHG &nbsp;dst,src &nbsp;字节或字交换=exchange必须有一个操作数在寄存器中,结果不影响标志位可以实现字节数据交换,也可是实现字(2byte)数据交换</span></li>
<li><span style="font-size: 18px">XLAT 换码指令累加器AX是数据传送的核心输入指令/输出指令/换码指令都是通过AX完成的IN Acc,src &nbsp;&nbsp;其中Acc表示8位或16位的累加器IN AL,30H 将30端口中的数据读入到ALIN AX,20H 将20H端口中的数据读入到AL,同时将21H端口中的数据读入到AHXLAT换码指令:AL←(BX+AL),将累加器AL中的值转换为内存表中的某个值,再送回AL中;XLAT一般用来实现码制之间的转换,也称为【查表转换指令】</span></li>
<li><span style="font-size: 18px">地址传送</span></li>
<li><span style="font-size: 18px">LEA dst,src 装入有效地址=load effective address有效地址送寄存器指令将存储器的16位有效地址传送到通用寄存器LEA BX, 将(SI)+(BP)的结果送入BX注意:传送的是地址本身,而不是该内存地址处的数据</span></li>
<li><span style="font-size: 18px">LDS dst,src装入DS寄存器=load to data segment register地址指针送寄存器指令将src指示的前两个字节单元的内容送入指令中指定的通用寄存器,同时将src+2指示的两个字节内容送入DS;LDS BX,ARR &nbsp;&nbsp;&nbsp;(ARR)=010H &nbsp;(SI)=020H &nbsp;(BX)=6AE0H(20030H)=0080H &nbsp;(20032H)=4000H &nbsp;EA=ARR=0010H+0020H=0030H,PA=(DS)*10H+EA=20000H+0030H=20030HSRC+2=EA+2H=0032H,PA=(DS)*10H+EA=20000H+0032H=20032H指令执行后(BX)=0080H &nbsp;(DS)=4000H将存储器MEM中的两个16位数据作为地址,分别送入BX和DS</span></li>
<li><span style="font-size: 18px">LES dst,src 装入ES寄存器=load to extra segment register和LDS指令类似,指示将寄存器由DS改为ES</span></li>
<li><span style="font-size: 18px">标志位传送</span></li>
<li><span style="font-size: 18px">标志寄存器指令共4条,这些指令都是单字节(1byte)指令操作数以隐含的形式规定,默认为AH寄存器</span></li>
<li><span style="font-size: 18px">LAHF=将FLAG低字节送入AH=load to AH from flag register将FLAG中5个标志位SF、ZF、AF、PF、CF分别取出,传送到累加器AG的对应位;</span></li>
<li><span style="font-size: 18px">SAHF=将AH内容装入FLAG低字节=send AH to flag registerLAHF的反向操作,将AH寄存器中的对应位传送到FLAG对应的5个标志位SF、ZF、AF、PF、CF</span></li>
<li><span style="font-size: 18px">PUSHF=将FLAG内容压栈=push flag register先将SP减2,然后将标志寄存器FLAG中的内容压入栈</span></li>
<li><span style="font-size: 18px">POPF=从堆中弹出一个字给FLAG=pop flag registerPUSHF的反向操作,将堆栈内容弹出到标志寄存器FLAG,然后加2</span></li>
<li><span style="font-size: 18px">PUSHF和POPF的作用①保护调用过程以前的标志寄存器的值,过程返回后再回复此标志位;②用来修改标志寄存器中相应标志位的值;</span></li>
</ul>
<h2><span style="font-size: 18px">算数指令</span></h2>
<h3><span style="font-size: 18px">加法*3</span></h3>
<ul>
<li><span style="font-size: 18px">ADD dst,src &nbsp;加法(字节/字)=addition■ &nbsp;两个存储器操作数MEM不能直接相加,■ &nbsp;段寄存器不能参与运算,■ &nbsp;两个操作数类型保持一致</span></li>
<li><span style="font-size: 18px">ADC dst,src &nbsp;带进位加法(字节/字)=addition with carry</span></li>
<li><span style="font-size: 18px">INC dst &nbsp;加1(字节/字)=increase自增(i++)■ &nbsp;操作数只能是通用寄存器REG或存储器MEM,■ &nbsp;操作数不可以用立即数IMME■ &nbsp;操作数不可以用段寄存器segment■ &nbsp;常用语循环中修改指令或用作循环计数器,</span></li>
</ul>
<h3><span style="font-size: 18px">减法*5</span></h3>
<ul>
<li><span style="font-size: 18px">SUB dst,src 减法(字节/字)=subtraction</span></li>
<li><span style="font-size: 18px">SBB dst,src &nbsp;带借位减法(字节/字)=subtraction with borrow</span></li>
<li><span style="font-size: 18px">DEC dst &nbsp;减1=decrease自减(i--)</span></li>
<li><span style="font-size: 18px">NEC dst &nbsp;取补=negative操作对象中的内容取2的补码,相当于先按位取反,然后末位加1</span></li>
<li><span style="font-size: 18px">CMP dst &nbsp;比较=compare■ &nbsp;CMP与SUB指令一样执行减法操作,但是不保存结果■ &nbsp;指令执行后,两个数不会改变,■ &nbsp;这条指令是根据操作的结果设置状态标志位,按照比较结果使程序产生条件转移;CMP AL,0 &nbsp;&nbsp;AL和0进行比较JGE NEXT &nbsp;&nbsp;&nbsp;如果AL&gt;0则转到NEXT位置执行</span></li>
</ul>
<h3><span style="font-size: 18px">乘法*2</span></h3>
<ul>
<li><span style="font-size: 18px">MUL src 不带符号乘法=multiply■ &nbsp;乘数由src指定,被乘数隐式指定;结果也隐式指定;■ &nbsp;被乘数默认存放于AL或AX中;结果默认存放于AX或(AX和DX)中■ &nbsp;8位*8位=16位,AL被乘数,src乘数,AX积■ &nbsp;16位*16位=32位,AX被乘数,src乘数,积:AX存低16位DX存高16位■ &nbsp;src可采用寄存器操作数、存储器操作数,不能采用段寄存器或者立即数;</span></li>
<li><span style="font-size: 18px">IMUL src带符号乘法=integer multiplication■ &nbsp;src可采用寄存器操作数、存储器操作数,不能采用段寄存器或者立即数;</span></li>
</ul>
<h3><span style="font-size: 18px">除法*4</span></h3>
<ul>
<li><span style="font-size: 18px">DIV src 不带符号除法=divide ■ &nbsp;8086规定:除数长度只能是被除数长度的一半;■ &nbsp;被除数16位时,除数只能8位,被除数32位时,除数只能16位;■ &nbsp;被除数、除数、商、余数全部都是无符号数;src位字节(1byte)数据时:被除数AX,除数src,商AL,余数AHsrc为字(2byte)数据时:被除数DX AX,除数src,商AX,余数DX</span></li>
<li><span style="font-size: 18px">IDIV src 带符号除法=integer divide■ &nbsp;被除数、除数、商、余数全部都是带符号数,且余数符号位与被除数相同;</span></li>
<li><span style="font-size: 18px">CBW 字节扩展=change byte to word(1byte→2byte)■ &nbsp;用一个操作数的符号位形成另一个操作数;■ &nbsp;后一个操作数的各位全是0(正数)或全是1(负数);■ &nbsp;结果是使数据位数加长,但数据大小不变;■ &nbsp;符号扩展指令不影响标志位FLAG;CBW将字节转换为字,将AL中的符号位扩展到AH中;若AL中D7=0,则(AH)=00H,若AL中D7=1,则(AH)=FFH</span></li>
<li><span style="font-size: 18px">CWD 字扩展=change word to double word(2byte→4byte)CWD将字转换为双字,将AX中的符号位扩展到DX中;若AX中D15=0,则(DX)=0000H,若AX中D15=1,则(DX)=FFFFH,</span></li>
</ul>
<h3><span style="font-size: 18px">十进制调整*6</span></h3>
<ul>
<li><span style="font-size: 18px">AAA 非组合BCD码的加法调整=ascii add with adjust</span></li>
<li><span style="font-size: 18px">DAA 组合BCD码的加法调整=decimal add with adjust</span></li>
<li><span style="font-size: 18px">AAS 非组合BCD码的减法调整=ascii adjust on substract</span></li>
<li><span style="font-size: 18px">DAS 组合BCD码的减法调整=decimal adjust on substract</span></li>
<li><span style="font-size: 18px">AAM 非组合BCD码的乘法调整=ascii adjust on multiplication</span></li>
<li><span style="font-size: 18px">AAD 非组合BCD码的除法调整=ascii adjust on divide</span></li>
</ul>
<h2><span style="font-size: 18px">逻辑指令</span></h2>
<h3><span style="font-size: 18px">逻辑运算</span></h3>
<ul>
<li><span style="font-size: 18px">NOT dst 非(字节/字)</span></li>
<li><span style="font-size: 18px">AND dst,src 与(字节/字)</span></li>
<li><span style="font-size: 18px">OR dst,src 或(字节/字)</span></li>
<li><span style="font-size: 18px">XOR dst,src 异或(字节/字)</span></li>
<li><span style="font-size: 18px">TEST dst,src 测试(字节/字)执行与操作,结果不回送;只影响状态标志位PF、SF、ZF,使CF=0,OF=0;可以在不改变原有操作数的情况下,检测某一位或某几位是0还是1;</span></li>
</ul>
<h3><span style="font-size: 18px">一般位移</span></h3>
<ul>
<li><span style="font-size: 18px">SHL dst,计数值 &nbsp;逻辑左移(字节/字)=shift leftSHL dst,1/CL左移一位或CL中指定位数;左移1位时,最高位移出到CF【进位标志位】中,最低位补0;■ &nbsp;dst可以是存储器操作数或通用寄存器擦作数;■ &nbsp;dst不能是立即数或段寄存器操作数;■ &nbsp;dst可以是8位或16位;■ &nbsp;如果移位次数大于1,则应将移位次数放入CL中;■ &nbsp;SHL将影响CF、OF、SF、ZF、PF标志位;■ &nbsp;利用左移1位可以实现操作数*2的运算</span></li>
<li><span style="font-size: 18px">SHR dst,计数值 &nbsp;逻辑右移(字节/字)=shift rightSHR dst,1/CL 右移一位或CL中指定位数;右移1位时,最低位移出到CF【进位标志位】中,最高位补0■ &nbsp;利用右移1位可以实现无符号操作数/2的运算</span></li>
<li><span style="font-size: 18px">SAL dst,计数值 &nbsp;算数左移(字节/字)=arithmatic shift leftSAL dst,1/CL左移一位或CL中指定位数;左移1位时,最高位移出到CF【进位标志位】中,最低位补0;■ &nbsp;利用左移1位可以实现操作数*2的运算</span></li>
<li><span style="font-size: 18px">SAR dst,计数值 &nbsp;算数右移(字节/字)=arithmatic shift rightSHR dst,1/CL 右移一位或CL中指定位数;右移1位时,最低位移出到CF【进位标志位】中,最高位补符号位■ &nbsp;SAR将影响CF、OF、SF、ZF、PF标志位;■ &nbsp;利用右移1位可以实现带符号操作数/2的运算</span></li>
</ul>
<h3><span style="font-size: 18px">循环位移</span></h3>
<ul>
<li><span style="font-size: 18px">ROL dst,计数值 &nbsp;循环左移(字节/字)=rotate left左移1位时,最高位移出到CF【进位标志位】中,同时送入最低位;</span></li>
<li><span style="font-size: 18px">ROR dst,计数值 &nbsp;循环右移(字节/字)=rotate right右移1位时,最低位移出到CF【进位标志位】中,同时送入最高位;</span></li>
<li><span style="font-size: 18px">RCL dst,计数值 &nbsp;带进位循环左移(字节/字)=rotate left with carry左移1位时,最高位移出到CF【进位标志位】中,CF中原有内容送入最低位;</span></li>
<li><span style="font-size: 18px">RCR dst,计数值 &nbsp;带进位循环右移(字节/字)=rotate right with carry右移1位时,最低位移出到CF【进位标志位】中,CF中原有内容送入最高位;</span></li>
<li><span style="font-size: 18px">4种指令,均影响CF、OF、SF、ZF、PF标志位;</span></li>
</ul>
<h2><span style="font-size: 18px">串指令</span></h2>
<h3><span style="font-size: 18px">串指令操作对象:内存中地址连续的字节串或字串;每次基本操作后,能够自动修改地址指针,为下一次操作做准备;基本串操作指令前可以加【操作重复前缀】使指令操作重复;用重复前缀比用循环快得多;</span></h3>
<h3><span style="font-size: 18px">约定:以DS:SI寻址源串,以ES:DI寻址目标串;用方向标志规定串处理方向,方向标志DF=0,从低地址到高地址方向处理;字节操作指针+1,字操作指针+2;方向标志DF=1,从高地址到低地址方向处理;字节操作指针-1,字操作指针-2;■ &nbsp;可以在串操作指令前加重复前缀,对一个以上串进行操作;■ &nbsp;必须用CX作为重复次数计数器,串操作指令每执行一次,计数-1,直到减为0为止;</span></h3>
<h3><span style="font-size: 18px">串传送指令</span></h3>
<ul>
<li><span style="font-size: 18px">MOVS----&gt;move string;MOVES dst,src(字节/字)MOVESB(字节),MOVESW(字):(DI)←((SI)),将SI所指单元的内容传送到DI所指单元,然后修改地址指针;字节操作时:SI←(SI)±1,DI←(DI)±1字操作时:SI←(SI)±2,DI←(DI)±2当方向标志位DF(direction flag)=0时,用+ ,DF=1时,用-;该指令不影响标志位;</span></li>
</ul>
<h3><span style="font-size: 18px">串存储指令</span></h3>
<ul>
<li><span style="font-size: 18px">STOS----&gt;store string;格式:STOS dst,STOSB字节存储,STOSW字存储字节操作:(DI)←(AL)将AL内容送入DI所指字节单元;DI←(DI)±1指针移位字操作:(DI)←(AX)将AL内容送入DI所指字单元;DI←(DI)±2指针移位■ &nbsp;该指令把AL或AX内容送入由DI指示的附加段ES(extra segment);■ &nbsp;同时,根据DF(direction flag)值及数据类型修改DI(destination index)值;■ &nbsp;STOS不影响标志位;STOS配合REP(repeat操作重复前缀),可将存储区中某一连续区域放入相同的内容;</span></li>
</ul>
<h3><span style="font-size: 18px">取串指令</span></h3>
<ul>
<li><span style="font-size: 18px">LODS----&gt;load string;格式LODS dst,LODSB字节,LODSW字字节操作:AL←((SI))将SI所指单元内容送入AL,SI←(SI)±1 指针移位字操作:AX←((SI))将SI所指单元内容送入AX,SI←(SI)±2 指针移位■ &nbsp;用来从数据段取出一个字节/字,一般不和REP配合使用;</span></li>
</ul>
<h3><span style="font-size: 18px">串比较指令</span></h3>
<ul>
<li><span style="font-size: 18px">CMPS----&gt;compare string;格式CMPS dst,src,CMPSB字节,CMPSW字;字节操作:((SI))-((DI))相减,SI←(SI)±1,DI←(DI)±1指针移位字操作:((SI))-((DI))相减,SI←(SI)±2,DI←(DI)±2指针移位■ &nbsp;将两个字节/字数据相减,结果不送回,只影响标志位;■ &nbsp;CMPS和REPE/PEPZ或REPNE/REPNZ配合,可以判断两个字符串是否相等;</span></li>
</ul>
<h3><span style="font-size: 18px">串搜索指令</span></h3>
<ul>
<li><span style="font-size: 18px">SCAS----&gt;scan string;SCAS dst,src;SCASB;SCASW;字节操作:AL-((ID))相减,DI←(DI)±1指针移位字操作:AX-((ID))相减,DI←(DI)±2指针移位相减结果不送回,只影响状态标志位;</span></li>
</ul>
<h3><span style="font-size: 18px">方向标志DF处理指令</span></h3>
<ul>
<li><span style="font-size: 18px">方向标志清除指令CLD(clear direction flag):使DF=0,串操作时,使地址自增++;方向标志设置指令STD(set direction flag):使DF=1,串操作时,使地址自减--;</span></li>
</ul>
<h3><span style="font-size: 18px">重复操作前缀指令</span></h3>
<ul>
<li><span style="font-size: 18px">REP----&gt;repeat ;格式REP String Primitive;原始串指令String Primitive可以为MOVES,STOS,LODS;REP使后面的串指令重复执行;执行次数预存如CX中;每执行一次串指令,(CX)--,直到(CX)=0,指令结束;</span></li>
<li><span style="font-size: 18px">REPE/REPZ(repeat when equal /zero flag)相等或为0时重复;String Primitive可以为CMPS,SCAS;当(CX)≠0并且比较相等的情况下,重复串指令;重复次数存入CX;</span></li>
<li><span style="font-size: 18px">REPNE/REPNZ(repeat when not equal/ zero flag) ;String Primitive可以为CMPS,SCAS;当(CX)≠0并且比较不相等的情况下,重复串指令;重复次数存入CX;</span></li>
<li><span style="font-size: 18px">REPC----&gt;repeat when carry flag &nbsp;&nbsp;进位时重复REPNC----&gt;repeat when not carry flag &nbsp;不进位时重复</span></li>
</ul>
<h2><span style="font-size: 18px">控制指令控制转移指令</span></h2>
<h3><span style="font-size: 18px">分类</span></h3>
<ul>
<li><span style="font-size: 18px">段内转移:只改变IP不改变CS段间转移:同时改变IP和CS</span></li>
<li><span style="font-size: 18px">无条件转移指令、条件转移指令、循环控制指令、子程序调用和返回指令</span></li>
</ul>
<h3><span style="font-size: 18px">无条件转移</span></h3>
<ul>
<li><span style="font-size: 18px">JMP----&gt;jump &nbsp;oprJMP SHORT opr &nbsp;&nbsp;段内直接短转移指令JMP NEAR PTR opr 段内直接近转移指令JMP WORD PTR opr &nbsp;段内间接转移指令JMP FAR PTR opr &nbsp;段间直接转移指令JMP DWORD PTR opr &nbsp;段间间接转移指令opr为转移目标地址,可以使用符号地址(标号)</span></li>
<li><span style="font-size: 18px">SHORT表示汇编程序将目标地址opr汇编成8位偏移量有效地址是当前IP值和指令中给定的8位偏移量opr值之和;</span></li>
<li><span style="font-size: 18px">NEAR PTR表示汇编程序将符号地址opr汇编成16位偏移量;目标地址(有效地址)为当前IP值和指令中给定的16位偏移量opr值之和;</span></li>
<li><span style="font-size: 18px">偏移地址紧跟在指令码之后,由汇编程序计算得出;</span></li>
</ul>
<h3><span style="font-size: 18px">条件转移指令</span></h3>
<ul>
<li><span style="font-size: 18px">以某些标志位的状态或者标志位的逻辑运算结果作为依据,以此决定是否转移;标志位通常由转移指令的上一条指令设置;若果满足条件,则执行条件转移指令指定的位置,如果不满足,则继续执行条件转移指令之后的指令;</span></li>
<li><span style="font-size: 18px">JZ/JE(jump if zero、jump if equal),为0/相等,ZF(zero flag)=1;JNZ/JNE(jump if not zero,jump if not equal),不为0/不相等,ZF=0JS(jump if sign flag),符号为负,SF(sign flag)=1;JNS(jump if not sign flag),符号不为负,SF=0JO(jump if overflow),结果溢出,OF(overflow flag)=1;JNO(jump if not overflow),结果不溢出,OF=0JP/JPE(if parity flag,if parity is even),1的个数为偶数,PF=1;JNP/JPO(if not parity flag,if parity is odd),1的个数为奇数,PF=0JC/JB/JNAE(if carry flag,if blow,if not above or equal),进位/低于/不高于,CF=1JNC/JNB/JAE(if not carry,if not blow ,if above or equal),CF=0JBE/JNA(if blow &nbsp;or equal,if not above)小于等于/不高于,CF=1或ZF=1JNBE/JA(not blow or equal,above)不低于等于/高于,CF=0或ZF=0JL/JNGE(less,not greater or equal)小于/不大于等于,SF≠OFJNL/JGE(not less,greater or equal)不小于/大于或等于,SF=OFJLE/JNG(less or equal,not greater)小于等于/不大于,ZF≠0或ZF=1JNLE/JG(not less or equal,greater)不小于等于/大于,SF=0或ZF=0</span></li>
<li><span style="font-size: 18px">偶数even number &nbsp;&nbsp;奇数odd number;parity 奇偶性,carry 进位,borrow借位</span></li>
</ul>
<h3><span style="font-size: 18px">循环控制指令</span></h3>
<ul>
<li><span style="font-size: 18px">LOOP ,循环,CX=CX-1,CX≠0LOOPE/LOOPZ(equal /zero),等于/结果为0循环,CX=CX-1,ZF=1且CX≠0LOOPNE/LOOPNZ(not equal /not zero )不等于/结果不为0,CX=CX-1,ZF=0且CX≠0JCXZ(jump when CX is zero ),CX内容为0转移,CX=0</span></li>
<li><span style="font-size: 18px">循环控制指令根据结果的标志位状态进行控制操作;循环控制指令本身不影响标志位;转向的目的地址范围:当前IP为中心的-128~+127之间;循环控制指令以CX为计数器,每执行一次指令,CX-1,直到为零,循环结束;转向的目的地址(IP)=(IP)+位移量;LOOPE/LOOPZ执行的三个操作:①CX=CX-1②CX是否为0③ZF值判断,</span></li>
</ul>
<h3><span style="font-size: 18px">子程序调用/返回指令</span></h3>
<ul>
<li><span style="font-size: 18px">段内调用:CALL NEAR PTR opr段间调用:CALL FAR PTR opr子程序返回:RET (RET=return)opr为子程序名,也就是子程序第一条指令的符号地址</span></li>
<li><span style="font-size: 18px">CALL----&gt;call RET----&gt;return RETF----&gt;return far</span></li>
</ul>
<h3><span style="font-size: 18px">处理器控制指令</span></h3>
<ul>
<li><span style="font-size: 18px">功能</span></li>
<li><span style="font-size: 18px">修改状态标志位;控制CPU,使CPU暂停、等待、空操作;</span></li>
<li><span style="font-size: 18px">标志操作</span></li>
<li><span style="font-size: 18px">STC----&gt;set carry 进位标志置1,即CF=1CLC----&gt;clear carry 进位标志置0,即CF=0CMC----&gt;carry make change ,进位标志取反STD----&gt;set direction方向标志置1,即DF=1CLD----&gt;clear direction 方向标志置0,即DF=0STI----&gt;set interrupt 中断标志置1,即IF=1CLI----&gt;clear interrupt中断标志置0,即IF=0</span></li>
<li><span style="font-size: 18px">CPU控制</span></li>
<li><span style="font-size: 18px">HLT----&gt;halt 停机WAIT----&gt;wait 等待ESC----&gt;escape 交权LOCK----&gt;lock 封锁总线NOP----&gt;no operation空操作</span></li>
</ul>
<h2><span style="font-size: 18px">DOS和BIOS中断调用</span></h2>
<h3><span style="font-size: 18px">DOS功能调用,可以完成对文件、设备、内存的管理;这些功能模块就是几十个独立的【中断服务程序】;【中断服务程序】的入口地址由系统置入【中断向量表】中;在汇编语言中,可以用【中断指令】直接调用;</span></h3>
<h3><span style="font-size: 18px">调用方法/步骤:①将【入口参数】送入指定寄存器;②将子程序【功能号】送入AH寄存器;③使用INT 21H指令转入子程序入口,执行相应操作;</span></h3>
<h3><span style="font-size: 18px">AH=01H,表示带显示的键盘输入;01号功能调用,是系统扫描键盘,并等待键盘输入单个字符;当有键按下时,先检查是否Ctrl+Break键,若是则将字符键值(ASCII码)送入AL,并在屏幕上显示该字符,此调用没有【入口参数】;MOV AH,01H &nbsp;&nbsp;&nbsp;&nbsp;INT 21H</span></h3>
<h3><span style="font-size: 18px">AH=02H,表示从显示器上输出单个字符;02号功能的入口参数:被显示字符的(ASCII码)送入DL;MOV DL,'S' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV AH,02H &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT 21H</span></h3>
<h3><span style="font-size: 18px">AH=09H,在显示器上输出字符串;将指定字符串送显示器显示;字符串预存入内存的数据缓冲区;字符串首地址送入指定位置,并且字符串必须以'$'结束;入口参数:DS(data segment):DX(data register)指向字符串的首单元;</span></h3>
<h3><span style="font-size: 18px">AH=0AH,将字符串输入到缓冲区;将键盘输入的字符串写入内存缓冲区;为了接收字符,首先在内存区定义一个缓冲区;缓冲区第一个字节是缓冲区字符个数;第二个字节用作系统填写实际键入字符总数;从第三个字节开始存放字符串;输入字符串以回车键结束;如果输入字符不足以填满缓冲区,其余字节补0;若输入字符个数大于定义长度,超出字符将丢弃,并响铃警告;</span></h3>
<h3><span style="font-size: 18px">BIOS中断调用IBM PC在ROM中提供了BIOS基本输入/输出系统,占用系统板上8KB空间,又称为ROM BIOS;BIOS为用户程序和系统程序提供主要外设的控制功能;如系统加电自检、引导装入、对键盘/磁盘/磁带/显示器/打印机/异步串行通信接口的控制;计算机系统软件就是利用这些基本的设备驱动程序,完成各种功能操作;每个功能模块的入口地址都在【中断是量表】中;通过中断指令INT n,可以直接调用;n是中断类型号,每个类型号n对应一种IO设备的中断调用,每个中断调用又以功能号来区分其控制功能;</span></h3>
<h2><span style="font-size: 18px">其他</span></h2>
<h3><span style="font-size: 18px">在汇编源程序中,数据不能以字母开头,如FFH应写为0FFH;程序加载后,CX内存储的是程序段的长度(字节数);DS中存储的是空闲内存区的段地址;CS中存储的是代码段的段地址,CS-DS=10H,左移变为100H=256Byte,存放PSP=程序段前缀;操作系统(DOS)利用PSP和程序进行通信;</span></h3>
<h3><span style="font-size: 18px">操作数类型operand</span></h3>
<ul>
<li><span style="font-size: 18px">立即数=立即操作数=immediate operand=IMME寄存器操作数=Register operand=REG存储器操作数=Memory operand=MEM输入输出端口操作数=Input/Output port operand</span></li>
</ul>
<h3><span style="font-size: 18px">指令类型</span></h3>
<ul>
<li><span style="font-size: 18px">隐含操作数指令、单操作数指令、双操作数指令</span></li>
</ul>
<h3><span style="font-size: 18px">指令通常不直接给出操作数,而是给出操作数的存放地址;【寻址方式】寻找操作数地址的方式;8086寻址方式*7:立即数寻址、寄存器寻址、和存储器寻址*5;存储器寻址*5:(直接寻址/寄存器间接寻址/寄存器相对寻址/基址变址寻址/相对基址变址寻址)BX(base) SI(source index)DI(destination)对应数据段DS(data segment)BP(base pointer)对应栈段SS(stack segment)立即数寻址:立即数作为操作数;寄存器寻址:寄存器名称作为操作数;EA=REG Name;</span></h3>
<h3><span style="font-size: 18px">直接寻址:立即数作为地址;EA=IMME;默认数据段DS;寄存器间接寻址:EA=(REG),BX/SI/DI默认数据段DS,BP默认栈段SS;寄存器相对寻址:EA=(REG)+IMME;BX/SI/DI默认数据段DS,BP默认栈段SS;基址变址寻址:EA=(基REG)+(变REG);BX默认DS,BP默认SS;相对基址变址寻址:EA=(基REG)+(变REG)+IMME;BX默认DS,BP默认SS;</span></h3>
<h1><span style="font-size: 18px"><strong>机器指令</strong></span></h1>
<h2><span style="font-size: 18px">概念</span></h2>
<h3><span style="font-size: 18px">8086指令采用变长指令,指令长度可有1-6个字节组成8086机器指令有零或多个操作数每种指令的操作码: 对应着机器指令的一个二进制编码 ,用一个唯一的助记符表示(指令功能的英文缩写)</span></h3>
<h2><span style="font-size: 18px">组成</span></h2>
<h3><span style="font-size: 18px">8086指令由操作码和操作对象两部分组成在一条指令中,操作码部分是必需的,而操作数部分可能隐含在操作码中,或者由操作码后面的指令给出</span></h3>
<h3>&nbsp;</h3>
<p>&nbsp;</p>
<h2><span style="font-size: 18px">详细</span></h2>
<h3><span style="font-size: 18px">操作码(4-7位)</span></h3>
<ul>
<li><span style="font-size: 18px">高6位是操作码,后面两位是DW特征位/标志位mov操作码100010/push操作码111111pop操作码100011/add操作码000000sub操作码001010</span></li>
</ul>
<h3><span style="font-size: 18px">标志位(2位)</span></h3>
<ul>
<li><span style="font-size: 18px">特征位=标志位,大部分是DW标志位,除了D/W标志位,某些指令格式中还会使用SW,VW,ZW标志位</span></li>
<li><span style="font-size: 18px">标志位D</span></li>
<li><span style="font-size: 18px">D表示数据传送方向,D=0,数据从寄存器传出,D=1,数据传入寄存器</span></li>
<li><span style="font-size: 18px">D=0ModR/M字节的REG域是源操作数D=1ModR/M字节的REG域是目标操作数</span></li>
<li><span style="font-size: 18px">标志位W</span></li>
<li><span style="font-size: 18px">说明传递的数据类型是字(2byte)还是字节(1byte)</span></li>
<li><span style="font-size: 18px">W=0,传递字节(1byte),W=1,传递字(2byte)</span></li>
</ul>
<h3><span style="font-size: 18px">MOD(2位)</span></h3>
<ul>
<li><span style="font-size: 18px">mod(2位):用来区分另一个操作数是在寄存器还是存储器中</span></li>
<li><span style="font-size: 18px">mod=00,存储器寻址,没有位移量mod=01,存储器寻址,有8位位移量mod=10,存储器寻址,有16位位移量mod=11,寄存器寻址,没有位移量</span></li>
</ul>
<h3><span style="font-size: 18px">REG(2-3位)</span></h3>
<ul>
<li><span style="font-size: 18px">用3位编码寻址8种不同的寄存器,根据不同的W,分别寻址16位和8位寄存器000 001 010 011 100 101 110 111AX &nbsp;&nbsp;CX &nbsp;&nbsp;DX &nbsp;&nbsp;BX &nbsp;&nbsp;SP &nbsp;&nbsp;BP &nbsp;&nbsp;&nbsp;SI &nbsp;&nbsp;&nbsp;DI &nbsp;&nbsp;(W=1)AL &nbsp;&nbsp;CL &nbsp;&nbsp;DL &nbsp;&nbsp;&nbsp;BL &nbsp;&nbsp;AH &nbsp;CH &nbsp;&nbsp;DH &nbsp;BH &nbsp;(W=0)</span></li>
<li><span style="font-size: 18px">对使用段寄存器的指令,REG占两位00 &nbsp;&nbsp;01 &nbsp;&nbsp;10 &nbsp;11ES &nbsp;&nbsp;CS &nbsp;&nbsp;SS &nbsp;&nbsp;DS</span></li>
</ul>
<h3><span style="font-size: 18px">R/M(3位)</span></h3>
<ul>
<li><span style="font-size: 18px">r/m(3位):受寻址方式mod控制,如果mod=11则r/m为寄存器寻址,r/m的值就是寄存器的编号,如果mod为00,01,10的话则是存储器寻址,r/m的值便是和mod组合来指定一个有效寻址方式</span></li>
</ul>
<h2><span style="font-size: 18px">举例</span></h2>
<h3><span style="font-size: 18px">89C8 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV &nbsp;&nbsp;&nbsp;&nbsp;AX(另一操作数),CX(第一操作数,传出/源)对应机器码 1000 1001 1100 1000■1-6位100010表示mov操作码;■7-8位01标志位,其中D=0表示数据从寄存器AX传出(源操作数)而不是传入;W=1,传递字(2byte);■9-10位11,mod=11,寄存器寻址,没有位移量;■11-13位001,reg=001,表示寄存器CX,■14-16位000,由于mod=11,000表示寄存器编号,也就是000对应的AX</span></h3>
<h3><span style="font-size: 18px">B82211 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV &nbsp;&nbsp;&nbsp;&nbsp;AX,11221011 1000 0010 0010 0001 00011 0 1 1 w reg data data if w e 1第一个字节前4位是操作码 W=1表示传递的数据类型是字 后3位代表寄存器编号AX(000) &nbsp;第二字节表示数据,如果w=1则是16位的数据</span></h3>
<h3><span style="font-size: 18px">8B872211 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV &nbsp;&nbsp;&nbsp;&nbsp;AX,对应机器码 1000 1011 1000 0111 0010 0010 0001 0001第一个字节前7位是操作码 W=1表示传递的数据类型是字 &nbsp;第二个字节前2位mod=10表示是存储器寻址,有16位位移量,接着3位reg=000表示寄存器编号是AX,因为mod=10,所以r/m后3位和mod组合成一个存储器寻址,查表得知mod=10 r/m=111对应的是BX+16位位移量(BX存储值与一个16位的数相加作为位移量/地址偏移量)由mod=10可以得知第三和四个字节为16位位移量1122(小端存储)</span></h3>
<h1><span style="font-size: 18px"><strong>寄存器</strong></span></h1>
<h2><span style="font-size: 18px">&nbsp;8086 CPU 中寄存器总共为 14 个,且均为 16 位 。即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG(PSW),CS,DS,SS,ES 。这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。</span></h2>
<h2><span style="font-size: 18px">通用寄存器</span></h2>
<h3><span style="font-size: 18px">&nbsp;在 8086 CPU 中,通用寄存器有 8 个,分别是 AX,BX,CX,DX,SP,BP,SI,DI ,这些个寄存器除了自身的专门用途外,还可以用来传送数据和暂存数据,所以才称它们为通用寄存器 。</span></h3>
<h2><span style="font-size: 18px">数据寄存器</span></h2>
<h3><span style="font-size: 18px">  AX (Accumulator):累加寄存器,或累加器;  BX (Base):基地址寄存器;  CX (Count):计数器寄存器;  DX (Data):数据寄存器;</span></h3>
<h3><span style="font-size: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AX 寄存器可以分为两个独立的 8 位的 AH 和 AL 寄存器;  BX 寄存器可以分为两个独立的 8 位的 BH 和 BL 寄存器;  CX 寄存器可以分为两个独立的 8 位的 CH 和 CL 寄存器;  DX 寄存器可以分为两个独立的 8 位的 DH 和 DL 寄存器;</span></h3>
<h3><span style="font-size: 18px">&nbsp;AX 寄存器,作为累加器,特殊用途是在使用DIV和MUL指令时使用。 BX主要是用做内存寻址时候表示偏移地址,[…]表示一个内存单元 CX 作为计数寄存器,在使用loop指令循环时用来指定循环次数的寄存器。 DX 寄存器,作为数据寄存器器,特殊用途是在使用DIV和MUL指令时使用。</span></h3>
<h2><span style="font-size: 18px">指针寄存器</span></h2>
<h3><span style="font-size: 18px">  SP (Stack Pointer):栈指针寄存器;  BP (Base Pointer):基指针寄存器;</span></h3>
<h3><span style="font-size: 18px">&nbsp;SP 寄存器上必须和 SS 段寄存器一起使用,表示栈顶的偏移地址,8086CPU中,有两个寄存器:段寄存器SS  存放栈顶的段地址寄存器SP  存放栈顶的偏移地址</span></h3>
<h3><span style="font-size: 18px">&nbsp;以 […] 的方式访问内存单元而且在 […] 中使用了寄存器 BP 的话,那么如果在指令中没有明确或者说是显示的给出段地址时,段地址则使用默认的 SS 寄存器中的值(BX,SI,DI 会默认使用 DS 段寄存器)</span></h3>
<h2><span style="font-size: 18px">变址寄存器</span></h2>
<h3><span style="font-size: 18px">  SI (Source Index):源变址寄存器;  DI (Destination Index):目的变址寄存器;</span></h3>
<h3><span style="font-size: 18px">  SI,DI 两个寄存器的功能和 BX 差不多,自然,SI 和 DI 中也是可以暂存一般性数据的,同时,通过使用 SI 和 DI 寄存器也是可以用来完成寻址操作的。SI和DI可以分别和BX,BP组合使用。</span></h3>
<h2><span style="font-size: 18px">段寄存器</span></h2>
<h3><span style="font-size: 18px">  CS (Code Segment):代码段寄存器;  DS (Data Segment):数据段寄存器;  SS (Stack Segment):栈段寄存器;  ES (Extra Segment):附加段寄存器;</span></h3>
<h3><span style="font-size: 18px">8086有20位地址总线,可传送20位地址,寻址能力为1M。8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。</span></h3>
<h3><span style="font-size: 18px">&nbsp;8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。段地址×16+偏移地址=物理地址,段的起始地址肯定是16的倍数,并且由于偏移地址最多16位,所以段长度最大为64KB(0000H~FFFFH)。</span></h3>
<h3><span style="font-size: 18px">CS中保存代码段寄存器的段地址,通常和IP一起使用,利用CS:IP确定当前需要执行的指令的地址。代码段是我们自己定义的一段内存,只是我们自己编程时候的逻辑定义。DS是数据段寄存器,存放的是数据段的段地址,偏移地址通常由BX,SI,DI或者常数给出,DS:BX。数据段是我们自己定义的一段内存,只是我们自己编程时候的逻辑定义。 SS是栈段寄存器,存放的是栈段的段地址,偏移地址通常由SP,BP给出,SS:SP。栈段是我们自己定义的一段内存,只是我们自己编程时候的逻辑定义。 ES是用于定义一个段的段地址,使用和CS、DS、SS类似。</span></h3>
<h2><span style="font-size: 18px">控制寄存器</span></h2>
<h3><span style="font-size: 18px">IP (Instruction Pointer):指令指针寄存器;</span></h3>
<h3><span style="font-size: 18px">IP通常是和CS一起使用,CS:IP表示将要读取的指令的内存地址,CS表示代码段地址,IP是表示偏移地址。(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;(2)IP = IP + 所读取指令的长度,从而指向下一条指令;(3)执行指令。 转到步骤 (1),重复这个过程。</span></h3>
<h2><span style="font-size: 18px">标志寄存器</span></h2>
<h3><span style="font-size: 18px">FLAG:标志寄存器,又称程序状态字PSW</span></h3>
<h3><span style="font-size: 18px">Flag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。</span></h3>
<h3><span style="font-size: 18px">OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1.SF sign Flag 符号标志 记录运算结果的符号,结果负时为1.ZF zero flag 零标志 运算结果等于0时为1,否则为0.CF carry flag 进位标志 最高有效位产生进位时为1,否则为0.AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0.PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0.IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断.TF trap flag 陷阱标志 用于调试单步操作.DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大.</span></h3>
<h2><span style="font-size: 18px">&nbsp;指针寄存器和 变址寄存器</span></h2>
<h3><span style="font-size: 18px">&nbsp;指针寄存器和 变址寄存器,包括:SP(Stack Pointer): 栈指针,与SS配合使用,可指向目前的堆栈位置BP(Base Pointer): 基址指针寄存器,可用作SS的一个相对基址位置SI(Source Index):源 变址 寄存器,可用来存放相对于DS段之源变址指针DI(Destination Index):目的 变址 寄存器,可用来存放相对于ES 段之目的变址 指针。</span></h3>
<h3><span style="font-size: 18px">这4个16位 寄存器只能按16位进行存取操作,主要用来形成 操作数的地址,用于堆栈操作和 变址运算中计算操作数的 有效地址。</span></h3>
<h2><span style="font-size: 18px">默认组合</span></h2>
<h3><span style="font-size: 18px">SS:SP 栈段地址+栈指针SS:BP 栈段地址+基指针DS:SI 数据段地址+源变址ES:DI 附加段地址+目标变址CS:IP &nbsp;代码段地址+指令指针DS:BX &nbsp;数据段地址+基数</span></h3>
<h2><span style="font-size: 18px">寄存器总结*14</span></h2>
<h3><span style="font-size: 18px">通用*4(ABCD):Accumulate+Base+Count+Data段*4(CDES):Code+Data+Extra+Stack指针*3(SBI):Stack+Base+Instruction变址*2(SD):Source+Destination标志*1 &nbsp;Flag</span></h3>
<ul>
<li><span style="font-size: 18px">通用*4=ACD(数据)B(地址)段*4=CDES(地址)指针*3=SBI(地址)变址*2=SD(地址)标志*1=Flag(状态)</span></li>
</ul>
<h1><span style="font-size: 18px"><strong>8086 &nbsp;术语说明IMME=immediate operand=立即操作数=立即数MEM=memory=存储器=内存REG=register=寄存器dst=destination operand=目的操作数src=source operand=源操作数effective address=EA=有效地址;physical address=PA=物理地址,segment address=SA=段地址</strong></span></h1>
<p>&nbsp;</p>
<p id="1657276440229"></p><br><br>
来源:https://www.cnblogs.com/zhangdezhang/p/16445720.html
頁: [1]
查看完整版本: 汇编语言Assembly Language.asm--8086(持续更新)