8086汇编语言知识点整理

2024-04-21 21:08

本文主要是介绍8086汇编语言知识点整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(进度:已完结)

前注

王爽汇编语言知识点整理,欢迎观看。
在这里插入图片描述

正文

  • 一个字由两个字节组成,这两个字节分别称为高位字节和低位字节,一个字节由8个bit组成(也就是两个内存单元),可以存在8位寄存器中,8086cpu都是16位

  • CPU访问内存时由段寄存器提供段地址,8086CPU的四个段寄存器是:CS、DS、SS、ES

  • SS:SP始终指向栈顶;CS:IP指向执行的下一条代码;DS存储默认段地址;CX用来记录循环次数

  • 载入程序时,CS保存了程序的长度(也是程序返回时的偏移地址),IP为0000h

  • 用Debug的R命令查看、改变CPU寄存器的内容:
    用Debug的D命令查看内存中的内容;
    用Debug的E命令改写内存中的内容;
    用Debug的U命令将内存中的机器指令翻译成汇编指令;
    用Debug的T命令执行一条机器指令;
    用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。
    用Debug的G命令执行指令到所指定的IP地址停止。
    用Debug的P命令快速执行LOOP循环到结束。

  • 常用符号ASCII码值
    : 58
    [ 91
    ] 93

  • PSP占用10H即256字节,虽然和程序区物理地址相连,但是段地址不同
    在这里插入图片描述

  • 使用p命令执行int 21

  • 汇编源程序中,数据不能以字母开头,需要在前面加0

  • debug和编译器masm对于[data]有不同解释,debug将其作为一个内存单元,masm将其作为data处理。可以在masm中使用类似于ds:[data]显式地指定内存单元

  • mov指令当在寄存器之间时,占两个字节;当在寄存器和立即数之间时,占三个字节(其余指令不建议记,-u查看更好,太多了)

  • 要知道assume是伪指令,是由编译器执行的,也是仅在源程序中存在的信息,CPU并不知道它们。我们不必深究assume的作用,只要知道需要用它将你定义的具有一定用途的段和相关的寄存器联系起来就可以了。

  • [bx+idata]一次移动两个字节

  • si和di是8086中和bx功能相近的寄存器

  • 只有bx、si、di和bp四个寄存器可以用于内存单元寻址

  • bx、si、di和bp这四个寄存器可以单独出现,或者只能以四种组合出现:bx和si、bx和di、bp和si、bp和di

  • 只要在[…]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中。

  • 用操作符Xptr指明内存单元的长度,X在汇编指令中可以为word或byte

  • push指令只进行字操作

  • div指令——除数:有8位和16位两种,在一个reg或内存单元中。被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放(结果在al存放,余数在ah存放);如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位(结果在ax存放,余数在dx存放)。

  • dup 用来进行数据的重复

  • offset功能是取得标号的偏移地址(CSAPP讲过这个欸)

  • jmp word ptr 内存单元地址(段内转移)

  • jmp dword ptr 内存单元地址(段间转移)(CS)=(内存单元地址+2)(IP)=(内存单元地址)

  • 我们从jcxz的功能中可以看出,“jcxz标号”的功能相当于:if((cx)==0)jmp short标号;

  • nop 空操作指令

  • ret指令用栈中的数据,修改IP的内容,从而实现近转移;retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移(第一个pop的是IP)。

  • call+ret=子程序

  • mul指令:8位一个默认放在AL中,另一个放在reg或者内存字节单元中;16位一个默认放在AX中,另一个放在16位reg或者内存字单元中;结果8位在AX中,16位高位在DX中,低位在AX中

  • flag寄存器(使用蓝色标出)

  • ZF标志位如果指令执行之后结果为0那么zf=1反之zf=0;

  • PF标志位,它记录相关指令执行后,其结果中所有bit位的个数是否为偶数,偶数为1奇数为0;

  • SF标志位,记录指令执行以后,结果是否为负(默认进行的运算是有符号运算),负数为1,非负为0

  • CF标志位记录无符号运算结果的进位值/借位值

  • OF标志位记录有符号运算结果是否溢出

  • 传送指令、inc指令、loop指令不影响标志位

  • or指令和and指令等逻辑操作对标志寄存器的影响是:OF和CF位被清零,SF、ZF、PF位的状态依计算结果而定,AF位的状态未定义。

  • adc带进位加法指令 sbb带借位减法指令 cmp比较指令

  • 因为溢出导致了实际结果为负(sf值为正),那么真正的结果必然为正,反之亦然

  • 在这里插入图片描述

  • movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增或递减。df=0增加,df=1减少。(传送的原始位置:ds:si;传送的目的位置:es:di;传送的长度:cx;传送的方向:df。)

  • movsw的功能是将ds:si指向的内存字单元中的字送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2。df=0增加,df=1减少。

  • 上面两个指令常配合rep使用,rep表示根据cx的值重复当前命令。

  • pushf将标志寄存器的值压栈,popf从栈中弹出数据送入标志寄存器

  • 在这里插入图片描述

  • 中断向量表中一个表项存放一个中断向量,一个表项占用两个字。高地址存放段地址,低地址存放偏移地址。

  • 可以使用offset a-offset b的方法计算代码段的长度

  • 存储N号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:N*4

  • 存储N号中断源对应的中断处理程序入口的段地址的内存单元的地址为:N*4+2

  • TF=1,执行单步中断程序

  • CPU可以直接读写以下3个地方的数据。
    (1)CPU内部的寄存器;
    (2)内存单元;
    (3)端口。

  • mov ax,ds:[8];
    假设执行前(ds)=0
    执行时与总线相关的操作如下所示:
    ①CPU通过地址线将地址信息8发出;
    ②CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据:
    ③存储器将8号单元中的数据通过数据线送入CPU

  • in al,60h;
    从60h号端口读入一个字节执行时与总线相关的操作如下:
    ①CPU通过地址线将地址信息60h发出;
    ②CPU通过控制线发出端口读命令,选中端口所在的芯片,并通知它,将要从中读取数据;
    ③端口所在的芯片将60h端口中的数据通过数据线送入CPU。

  • 访问8位端口用al,访问16位端口用ax

  • 端口写入out,端口读出in

  • shl是逻辑左移指令,它的功能为:
    (1)将一个寄存器或内存单元中的数据向左移位;
    (2)将最后移出的一位写入CF中;
    (3)最低位用0补充。

  • shr是逻辑右移指令,它和shl所进行的操作刚好相反。
    (1)将一个寄存器或内存单元中的数据向右移位;
    (2)将最后移出的一位写入CF中;
    (3)最高位用0补充。

  • cli 禁止中断发生
    sti 允许中断发生

  • 按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。断码=通码+80h。

  • 键盘缓冲区高字节存放扫描码,低字节存放ASCII码

  • int 16h从键盘缓冲区读取一个键盘输入,并将其从缓冲区中删除

  • 在这里插入图片描述

  • 组合类型
    与其它模块中的同名段在满足定位类型的前提
    下具有的组合方式:
    NONE: 不组合
    PUBLIC: 依次连接(顺序由LINK程序确定)
    COMMON: 覆盖连接
    STACK: 堆栈段的依次连接
    AT 表达式:段定义在表达式值为段基的节边界
    MEMORY: 相应段在同名段的最高地址处。

  • 宏: 源程序中由汇编程序识别的具有独立功能的一段程序代码

  • 1 宏命令伪指令由宏汇编程序处理,过程由CPU处理
    2 宏指令:简化源程序,不能简化目标程序
    子程序:产生相应的机器代码,每次调用用call,不重复出现机器代码,节省内存
    3 执行时间

总结:
我用了大概一个月学完本书,如果将全部精力放在上面的话,大概2~3星期就可以学完。
毫无疑问,这是一本理论实践俱全的书籍,在DosBox上敲指令也是比较愉快的学习经历。对于在学校要接触到8086汇编的童鞋来说,我非常推荐这本书。
剩下的部分等我学完x86再来总结吧。

这篇关于8086汇编语言知识点整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924043

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

JavaScript整理笔记

JavaScript笔记 JavaScriptJavaScript简介快速入门JavaScript用法基础语法注释关键字显示数据输出innerHTML innerText属性返回值的区别调试 数据类型和变量数据类型数字(Number)字符串(String)布尔值(Boolean)null(空值)和undefined(未定义)数组(Array)对象(Object)函数(Function) 变量

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义