您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 栈字母表 >

汇编语言学习笔记

发布时间:2019-08-09 23:37 来源:未知 编辑:admin

  一个CPU有N根地址线,可以说地址总线的宽度为N,最多可以寻找2的N次方个地址单元。2的地址总线~XXX…)=存储单元数=内存地址空间大小。

  控制总线-控制信息决定了CPU与其他器件进行数字传送时的一次数据传送量

  地址8000H-9FFFH的8KB空间为显存地址空间(数据会被输出到显示器上)

  地址A000H-FFFFH的24KB空间为各个ROM的地址空间(只读存储器,写入数据无效)

  主板(上的东西):存储器,外围芯片组,扩展插槽(RAM内存条和各类接口卡)通过总线与CPU连接。

  CPU通过总线向接口卡发送命令,接口卡通过CPU的命令控制外设(显示器,打印机等)进行工作。

  IP 指令指针寄存器(读取一条指令后,IP中的值自动增加。以字节为单位)

  R 查看、改变寄存器的内容(-r+Enter:查看/-r 某一寄存器:修改)

  D 查看内存中的内容(-d 段地址:偏移地址:可以查看从指定地址开始的128个内存单元的内容/-d 段地址:起始偏移地址 结尾偏移地址:查看范围)

  左边是每行的起始地址、中间是128个内存单元(字节)的内容、右边是内存单元的数据对应的可显示的ASCII码

  E 改写内存中的内容(-e 起始地址 数据:修改一列/-e 起始地址:.数据+空格键:修改某个)

  (-e 起始地址 数据 ‘字母’:字符/-e 起始地址 数据 “c++/IBM”:字符串)

  (E向内存中写入机器码,U查看内存中机器码的含义,T执行内存中的机器码)

  A 以汇编指令的形式在内存中写入机器指令(-a 起始地址/-a:从预设地址开始)

  (3). 段寄存器的操作有一些限制:段寄存器属专用寄存器,对他们的操作能力有限

  不允许段寄存器之间的直接数据传送,例如:MOV DS,ES ;非法指令:不允许段寄存器间传送

  (2) pop 指令的执行步骤: 从SS:SP指向的字单元中读取数据 SP=SP+2。

  (5)用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。

  PUSH/POP 寄存器/段寄存器/内存单元:将一个内存字单元处的字入栈/出栈,出栈的数据送入内存字单元处。

  我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们的安排。

  对于数据段,把段地址放在ds中,用mov,add,sub等访问内存单元的指令时,cpu就将我们定义的数据段内容当做数据来访问;

  对于代码段,把段地址放在cs:ip中,用mov,add,sub等访问内存单元的指令时,cpu就将执行我们定义的代码段的指令;

  对于栈段,把段地址放在ss:sp中,用push pop 等访问内存单元的指令时,cpu就将其当作堆栈来访问;

  assume cs:段名(将有特定用途的(用segment-ends定义的)段和相关的段寄存器关联起来。)

  在DOS中,command处理我们的各种输入:命令或要执行的程序的文件名。

  command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口。command停止运行,CPU运行,运行结束后返回到command。

  2.编译程序(编译器)-目标文件-连接程序-可执行文件(包含:1.程序:机器码 数据 2.相关信息:大小 日期)

  完整描述一个内存单元:内存单元的地址 和 内存单元的(长度)字节/字型。

  (2)判断cx中的值:如果cx≠0,转至标号处执行(注意IP),否则向下执行。

  例如:“g 0012”:将使debug从当前的CS:IP指向的指令执行,一直到(IP=0012)为止。

  P指令:一次性执行完循环,直到cx=0,在遇到“loop 偏移地址”时执行。

  DOS方式下,一般情况,0:200~0:2ff没有系统或其他程序的数据或代码。

  数据存放在代码段中,CS中存放代码段的段地址。用U命令查看到的是,在汇编指令前,用DW定义的数据。

  AND指令:逻辑与指令,按位进行与运算。将操作对象的相应位设为0,其余不变。

  用’……’的方式指明数据是以字符的形式给出,编译器将其转化为对应的ASCII码。

  用[bx+idata]的方式进行数组的处理:idata起始偏移地址,bx起始偏移地址的相对地址。

  注意:data:0是要处理的数据所在的位置,根据字符串的长度可以知道存放区域的偏移地址。比如:welcome 偏移地址为7(1个标点符号=1个字)

  (3)【bx+idata】用一个变量加一个常量来表示内存地址,可在一个起始地址的基础上用变量间接定位一个内存单元

  确定位置:起始地址和起始地址的相对地址;字符修改:确定字符在数组中的位置。

  一般来说,我们可以用[bx+si+idata]的方式来访问结构体中的数据,用bx定位整个结构体,用idata定位结构体中的某个数据项(相对地址),用si定位数组项中的每个元素。

  除数:有8位或16位两种,在一个寄存器reg或内存单元中。(除四个段寄存器为sreg外其他均为reg)

  被除数:默认在AX或AX和DX中:如果除数为8位,被除数为16位,放在AX中;如果除数为16位,被除数为32位,高16位放在DX中,低16位放在AX中。

  结果:如果除数为8位,则AL存储商,AH存储余数;如果除数为16位,则AX存储商,DX存储余数。

  1.可以修改IP或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令。

  3.JMP指令(无条件转移指令):转移的目的地址+转移的距离(段间转移,段内短转移,段内近转移)

  (1)依据位移进行转移的jmp指令:jmp short 标号:(转移到标号处执行指令)段内短转移 IP:-128~127

  (2)转移的目的地址在指令中的jmp指令:jmp far ptr 标号:段间转移(远zhaunyi) 高位段地址,低位偏移地址。

  (3)转移地址在寄存器中的jmp指令:jmp 16位寄存器(reg):(IP)=(16位寄存器)

  一. 两个相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在8位寄存器或内存字节单元中。如果是16位,一个默认放在AX中,另一个放在16位寄存器或内存字单元中。

  二. 结果:如果是8位乘法,结果默认放在AX中。如果是16位乘法,结果高位默认在DX中存放,低位在AX中存放。

  大量:内存单元:将批量数据放在内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。

  1.标志寄存器flag:8086CPU:16位:存储的信息:程序状态字(PSW)

  作用:用来存储相关指令的某些执行结果,用来对CPU执行相关指令提供行为依据,用来控制CPU的相关工作方式。

  PF标志(2):奇偶标志位,记录相关指令执行后,其结果的二进制中1的个数是否为偶数。如果为偶数,则pf=1;为奇数,则pf=0。

  注意:将结果化为2进制的16位数或8位数,看左边第一位,为0则sf=0,否则sf=1。

  CF标志(0):进位标志:一般情况下,在进行无符号数运算时,它记录了运算结果的最高有效位向更高位的进位值,或向更高有效位的借位值:0~255

  对位数为N的无符号数来说,其对应的二进制的最高有效位为第N-1位,而假象的第N位为更高位。

  注意:有溢出/进位/借位的数要存放在OF【有符号数】/CF【无符号数】(标志寄存器)中,而不是寄存器中。

  判断逻辑上真正结果的正负与实际结果的正负,得知比较的结果:cmp ah,bh:

  条件:指它可以根据某种条件决定是否修改IP:条件转移指令的转移位移[-128~127]

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

  (1)除法错误:0(2)单步执行:1(3)执行int0命令:4(4)执行int命令:n

  对于8086中断向量表指定存在内存地址0处。从0000:0000到0000:03e8单元。共1000个字节。中断向量表中一个表项存放一个中断向量,占两个字。分别存放段地址和偏移地址。

  (6)从内存地址为中断类型码*4和中断类型码*4 + 2 的两个字单元中读取中断处理程序的入口地址设置IP和CS

  2. int指令和iret指令配合使用与call指令和ret指令配合使用具有相似的思路。

  (1).开机后,cpu一加点,初始化(cs)= 0FFFFH,(IP)= 0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条跳转指令,cpu执行该程序后,转去执行BIOS中的硬件检测和初始化程序。

  (2).初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的内容,一直在内存中存在。

  (3).硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交给操作系统控制。

  (4).DOS启动后,除完成其他工作外,还将它提供的中断例程装入内存,并建立相应的中断向量。

  执行时系统将扫描键盘,等待有健按下,一旦有健按下,就将其字符的ASCII码读

  入,先检查是否Ctrl-Break,若是,退出命令执行;否则将ASCII码送AL,同时将

  MAXLEN DB 100 ;第1个字节指出缓冲区能容纳的字符个数,即缓冲区长度,不能为0

  说明:若希望显示字符串后,光标可自动回车换行,可在定义字符串时作如下更改:

  在PC系统中,CPU最多可以定位64KB个不同的端口,则端口地址的范围为0~65535

  端口的读写指令只有两条:in和out,分别用于从端口读写数据和往端口写入数据。

  在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。 访问8位端口时用al,访问16位端口时用ax。

  2. PC机中,有一个CMOS RAM芯片,一般简称CMOS。此芯片有以下特征:

  1) 包含一个实时钟和一个有128个存储单元的RAM存储器(早期的计算机为64个字节)。

  2) 该芯片靠电池供电。所以,关机后期内部的实时钟仍可正常工作,RAM中的信息不丢失。

  3) 128个字节的RAM中,内部实时钟占用0~0dh单元来保存时间信息,其余大部分单元用于保存系统配置信息,供系统启动时 BIOS程序读取。BIOS也提供了相关的程序,使我们可以在开机的时候配置 CMOS RAM中的系统信息。

  4) 该芯片内部有两个端口,端口地址为70h和71h。CPU通过这两个端口来读写CMOS RAM

  5) 70h为地址端口,存放要访问的CMOS RAM单元的地址;71h为数据端口,存放从选定的CMOS RAM单元中读取的数据,或要写入到其中的数据。

  如果移动位数大于1时,必须将移动位数放到cl中。如果只移动一位,则可以直接写出来。

  在CMOS RAM中,存放着当前的时间:年、月、日、时、分、秒。这6个信息的长度都为1个字节,存放单元为:

  这些数据以BCD码的方式存放。BCD码是以4位二进制数表示十进制码的编码方法。

  一个字节可表示两个BCD码。则CMOS RAM存储时间信息的单元中,存储了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。

  可屏蔽中断是CPU可以不响应的外中断。CPU是否响应可屏蔽中断,要看标志寄存器的IF位的设置。当CPU检测到可屏蔽中断信息时,如果I*F=1,则CPU在执行完当前指令后响应中断,引发中断过程;如果IF=0,则不响应可屏蔽中断。*

  将IF置0的原因就是,在进入中断处理程序后,禁止其他的可屏蔽中断。当然,如果在中断处理程序中需要处理可屏蔽中断,可以用指令将IF置1。

  不可屏蔽中断是CPU必须响应的外部中断。当CPU检测到不可屏蔽中断信息时,则在执行完当前指令后,立即响应,引发中断过程

  (1)键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描。按下一个键时,开关接通,该芯片就产生一个扫描码,扫描码说明了按下的键在键盘上的位置。扫描码被送入主板上的相关接口芯片的寄存器中,该寄存器的端口地址为60h。松开按下的键时,也产生一个扫描码,扫描码说明了松开的键在键盘上的位置。松开按键时产生的扫描码也被送入60h端口中。

  一般将按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。扫描码长度为一个字节,通码的第7位为0,断码的第7位为1,即:断码=通码 + 80h

  (2)键盘的输入到达60h端口时,相关的芯片就会向CPU发生中断类型码为9的可屏蔽中断信息。CPU检测到该中断信息后,如果IF=1,则响应中断,引发中断过程,转去执行int 9h中断例程

  BIOS提供了int 9h中断例程,用来进行基本的键盘输入处理,主要的工作如下:

  2) 如果是字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区;如果是控制键(如Ctrl)和切换键(如CapsLock)的扫描码,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储状态字节的单元;

  BIOS键盘缓冲区是系统启动后,BIOS用于存放int 9中断例程所接收的键盘输入的内存区。该内存区可以存储15个键盘输入,因为int 9中断例程除了接收扫描码外,还要产生和扫描对应的字符码,所以在BIOS键盘缓冲区中,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码。

  (3) 0040:17单元存储键盘状态字节,该字节记录了控制键和切换键的状态。键盘状态字节各位记录的信息如下:

  这种标号不但表示内存单元的地址,还表示了内存单元的长度,即表示在此标号处的单元,是一个字节单元,还是字单元,还是双字单元。如

  使用不带“:”的标号,它们是同时描述内存地址和单元长度的标号。这种标号包含了对单元长度的描述,所以,在指令中,它可以代表一个段中的内存单元。

  如果想在代码段中直接用数据标号访问数据,则需要用伪指令assume将标号所在的段和一个段寄存器联系起来。否则编译器在编译的时候,无法确定标号的段地址在哪一个寄存器中。

  在建立数据映射关系时,有时在数值计算方面找不到一致性的规律或者规律过于繁琐,可以使用在内存中构建表,以查表的方式来建立这种映射。

  我们将通过给出的数据进行计算或比较而得到结果的问题,转化为用给出的数据作为查表的依据,通过查表得到结果的问题。具体的查表方法,是用查表的依据数据,直接计算出所要查找的元素在表中的位置。像这种可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为:直接定址表。

  我们可以在直接定址表中存储子程序的地址,从而方便地实现不同子程序的调用。

  用根据功能号查找地址表的方法,程序的结构清晰,便于扩充。如果加入一个新的功能子程序,那么只需要在地址表中加入它的入口地址就可以。

  键盘输入将引发9号中断,BIOS提供了int9中断例程。CPU在9号中断发生后,执行int 9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中。

  int 16h中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0。下面的指令从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除。

  BIOS的int 9中断例程和int 16h中断例程是一对相互配合的程序,int 9中断例程向键盘缓冲区中写入,int 16h中断例程从缓冲区中读出。它们写入和读出的时机不同,int 9中断例程是在有键按下的时候向键盘缓冲区中写入数据;而int 16h中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出。

  3.5英寸软盘分为上下两面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区的大小为512个字节。则:2面*80磁道*18扇区*512字节=1440KB~=1.44MB

  磁盘的实际访问由磁盘控制器进行,我们可以通过控制磁盘控制器来访问磁盘。只能以扇区为单位对磁盘进行读写。在读写扇区的时候,要给出面号、磁道号和扇区号。面号和磁道号从0开始,而扇区号从1开始。

  大于9FFFh的十六进制数据A000H、A001H...FFFEH、FFFFH等,在书写的时候都是以字母开头的。而在汇编程序中,数据不能以字母开头,都要在前面加0。原因:ANSIC规定标识符必须是有字...博文来自:zfqzpp的专栏

  SEGMENTENDSENDCODEDATA两种书写格式1、简化段定义 书写源程序时格式简单,易于掌握,但只适用于高版本的MASM,且不能书写式对应的源程序。2、完整段定义 是一种标准的汇编...博文来自:似水流年

  指令集CISC(复杂指令集)X86架构向下兼容变长指令1-15字节,多数为2-3字节长度多种寻址方式(可访问不对齐内存地址)指令集的通用寄存器的个数有限X86-32系统下拥有8个通用寄存器(X86-6...

  1.1在计算机系统结构中的定位、指令系统概念及分类1.1.1在计算机系统结构中的定位、指令系统概念及分类汇编语言可以认为是一个指令集的助记符。汇编语言,很大程度上,可以认为是机器语言的一种助记符,跟它...

  GO语言汇编:plan9(贝尔操作系统)go开发者与plan9开发者同一人,RobPike寄存器:数据寄存器:R0-R7,地址寄存器:A0-A7,浮点寄存器:F0-F7。伪栈寄存器:FP,SP,TOS...

  《汇编语言第三版》豆瓣链接根据目前读的情况来看,这本书设计的还是面向初学的,又没有翻译书的那些语句毛病,循序渐进,图文并茂,好书!!! 第一章:基础知识计算机的核心是cpu,cpu通过总线(地址总线、...

  0x00用到的书籍《Android软件安全与逆向分析》第六章0x01原生程序的生成过程笔者是在Linux环境下测试的,详细过程见书中说明需要编译的C语言代码#includeintmain(intarg...

  上一篇文章,我们用比较原始的方法编写了主引导扇区的代码。点击链接查看上一篇文章:编写主引导扇区代码本片文章将学习以下内容:用一种不同的分段方法,从另一个不同的的角度理解处理器的分段内存访问机制使用循环...

  首先,为什么我为什么要学习汇编语言呢?—————是为了更好的学习单片机,写出更高级的代码。在读一些数据手册时,总是出现各种寄存器,对此有很多疑惑,总是学不会,所以准备自学下汇编,从而更好的理解这些地址...

  1基础知识1.7CPU对存储器的读写CPU想要进行数据的读写,必须和外部器件(标准说法是芯片)进行三类信息的交互存储单元的地址(地址信息)器件的选择,读或写的命令(控制信息)读或写的数据(数据信息)这...

  汇编语言学习笔记五、汇编语言程序设计顺序分支标号循环初始化:设置循环的初始状态循环体:循环的工作部分及修改部分控制条件:已知次数(loop)次数及特征值(loopz,loopnz)不知道次数,其它条件...

  【基础】汇编语言学习日志前言前言一年多前曾经看过汇编,但是当时的编程知识和硬件知识都很薄弱,导致很多内容是死记硬背很快就忘记了,最近重新找到了王爽编写的《汇编语言》pdf,打算重新回顾一下主要内容,夯...

  最近在看汇编语言相关的书籍,其中作者的程序中多次用到了assume伪指令,伪指令就是告诉编译器如何编译的,而assume语句应该是和最后的链接过程有关代码assumecs:codeds:datass:...

  一、汇编语言的发展汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令.汇编语言可以通过编译得到机器语言,机器语言可以通过反汇编得到汇编语言.也就是说汇编语言和机器语言之间是互逆的.高级语...

  一、汇编语言环境安装与配置1.这里主要是在8086CPU的环境下学习的汇编语言,所以需要模拟这样的环境。2.下载dosbox和masm,dosbox是一个dos模拟程序,我们现在用的操作系统和CPU大...

  汇编语言学习[2018-05-06],第1天由于linuxkernel学习中,有大量汇编代码阅读,理解有困难,现进行汇编语言的系统学习,暂停linuxkernel学习。汇编语言学习时长,预计2两个月,...

  第四章1.汇编程序中包含两种指令:伪指令与汇编指令伪指令(类似于C语言中用#开头的语句):assumecs:xxx(将寄存器与程序中的某个段相关联)xxxsegment:(段开始)...xxxends...

  一、使用汇编语言编写一个完整的程序,步骤大致入下:(1)编写源代码,文件拓展名为.asm(2)编译、连接(可使用微软的MSAM编译器)(3)调试、运行Snip20180209_2.png注意:汇编语言...

  1.汇编语言源程序包含汇编指令和伪指令两种指令。伪指令没有对应的机器指令,最终不被CPU执行。伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。2.segments和ends是写可被...

http://advntravel.com/zhanzimubiao/236.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有