8086汇编语言学习笔记
第6章 8086指令系统与汇编基础
第13页
2013年8月1日星期四
第6章
8086指令系统与汇编基础 3.段地址寄存器
有 CS、DS、ES、SS 四 个 , 分 别 表 示 程 序 码 ( code segment register)、 数 据 ( data segment register)、附加(extra segment register)、堆栈 (stack segment register)段地址用。在 DOS 系统 中,每一个段地址容量只有 64KBytes。 当数据段地址不够用时,就可以用附加数据段地址 来补足,例如想要将一个段地址的某些内容复制到 另一段地址中,就可以同时指定 DS、ES 分别表示 这两个段地址。
第17页 2013年8月1日星期四
第6章
6.2.4
8086指令系统与汇编基础
寄存器间接寻址(Register Indirect Addressing) 寄存器间接寻址方式中,操作数存放在存储器 中,但操作数的有效地址EA在基址寄存器BX、BP或 变址寄存器SI、DI中。操作数的物理地址为: 物理地址=16(段寄存器)+(寄存器)
执行结果为:(AX)=8060H 指令中也可指定段跨越前缀以取得其它段中的 数据。如:MOV AX,ES:[BX]指令,则从附加段中 取得数据。
操作码
DS 3000 0 BX + 200 0
代 码
段
30000 32000 AH AL
60 80
3200 0
数 据
段
图 6- 2- 2
例 6 - 5 的执行过程
第3页 2013年8月1日星期四
第6章
8086指令系统与汇编基础
计算机只能识别二进制代码,因此计算机能执行 的指令必须以二进制代码的形式表示,这种以二进制 代码形式表示的指令称为指令的机器码(Machine Code)。 2.汇编指令格式 一条指令一般包含操作码和操作数两部分。
第2章8086微处理器与汇编语言(下)
第二章微处理器与汇编语言(下)
2.3 指令系统
2.4 汇编语言
2.5 汇编语言程序设计
2.6 系统功能调用
2.7 宏指令、条件汇编及上机过程 2.8 模块化程序设计与混合编程
三、指令系统
1. 传送类指令
2. 算术运算类指令
3. 位操作类指令
4. 串操作指令
5. 循环和转移指令 6. 子程序的调用和返回指令 7. 输入输出指令
4. 表达式与运算符 (3)关系运算符 表2-4-3列出的关系运算符。
2. 汇编语言数据
(2)变量(续) ④ 带DUP表达式 DUP是定义重复数据操作符。格式如下:
表达式1是重复次数,表达式2是重复的内 容。例如: D_STR DB3)标号
标号是一条指令目标代码的符号地址。具 有以下三个属性: ● 段属性(SEG) ● 偏移量属性(OFFSET)
1. 传送类指令 (4)标志传送指令(续)
③
标志位进栈
格式:PUSHF
将标志寄存器压入堆栈。标志寄存器中各 标志位本身不受影响。
④
标志位出栈
格式:POPF
将堆栈顶部的内容弹入标志寄存器。
1. 传送类指令 (5)地址传送指令 ① 装入有效地址 格式:LEA DEST,SRC 指令对标志寄存器各位无影响。 ② 装入地址指针 格式:LDS DEST,SRC 或 LES DEST,SRC 指令对标志寄存器各位无影响。
第二章 8086微处理器与汇编语言
(下)
学习目标
1、识记80X86汇编语言指令集、伪指 令和宏、MASM表达式。 2、理解程序设计中顺序、分支、循环、 子程序的基本结构,以及实现方法。 3、识记汇编语言编程、上机调试的基 本方法。 4、识记DOS功能调用和BIOS中断调 用的方法和应用,以及混合编程的概念。
汇编语言指令集合 吐血整理
RET(return)
5.中断
INT(interrupt)指令
IRET(interrupt return)
INTO(interrupt if overflow)
六、处理机控制指令
1.标志处理指令
CLC(Clear carry)
CMC(Complement carry)
STC(Set carry)
CLD(Clear direction)
串比较指令
SCASB(Scan string of byte)
串搜索指令
SCASW(Scan string of word)
串搜索指令
STOSB(Store string of byte)
存串指令
STOSW(Store string of word)
存串指令
LODSB(Load string of byte)
ES(Extra Segment):附加段寄存器。
第一部分:指令助记符: 一、数据传送指令
1.通用数据传送指令 MOV(Move) PUSH(Push onto the stack) POP(Pop from the stack) XCHG(Exchange)
2.累加器专用传送指令 IN(Input) OUT(Output) XLAT(Translate)
REPE(Repeat when empty) 若(CX)=0,则退出,否则 CX=CX+1;
REPZ(Repeat when flag )
若 ZF=0,则退出,否则 CX=CX+1;
REPC(Repeat when carry flag)
REPNE(Repeat when not empty)
REPNZ(Repeat when not zero flag)
汇编语言学习笔记
汇编语言学习笔记《汇编语言》--王爽前言学习汇编目的:充分获得底层编程体验;深刻理解机器运行程序的机理。
原则:没有通过监测点不要向下学习;没有完成当前实验不要向下学习。
第一章基础知识有三类指令组成汇编语言:汇编指令;伪指令;其他符号。
8bit = 1byte = 一个存储单元有n根地址线,则可以寻址2的n次方个内存单元。
1.1节--1.10节小结(1)汇编指令是机器指令的助记符,同机器指令一一对应。
(2)每一种cpu都有自己的汇编指令集。
(3)cpu可以直接使用的信息在存储器中存放。
(4)在存储器中指令和数据没有任何区别,都是二进制信息。
(5)存储单元从零开始顺序编号。
(6)一个存储单元可以存储8个bit,即八位二进制数。
(7)每一个cpu芯片都有许多管脚,这些管脚和总线相连。
也可以说,这些管脚引出总线。
一个cpu可以引出的三种总线的宽度标志了这个cpu不同方面的性能。
地址总线的宽度决定了cpu的寻址能力;数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量;控制总线的宽度决定了cpu对系统中其他器件的控制能力。
监测点:1KB的存储器有1024个存储单元?存储单元的编号从0到1023.内存地址空间:最终运行程序的是cpu,我们用汇编编程时,必须要从cpu的角度思考问题。
对cpu来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu寻址能力的限制。
这个逻辑存储器即是我们所说的内存地址空间。
第二章寄存器(cpu的工作原理)mov ax, 2add ax, axadd ax, axadd ax, ax(1)cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;(2)段地址和偏移地址通过内部总线送人一个称为地址加法器的部件;(3)地址加法器将两个16位地址合成为一个20位的物理地址;(4)地址加法器通过内部总线将20位物理地址送人输入输出控制电路;(5)输入输出控制电路将20位物理地址送上地址总线;(6)20位物理地址被地址总线传送到存储器;段地址*16+偏移地址= 物理地址的本质含义内存并没有分段,段的划分来自cpu。
华中科技大学8086汇编讲义第三章宏汇编语言
第三章宏汇编语言每种计算机语言都规定了自己的字符、基本词汇、典型语句和语法规则。
同样,汇编语言也有自己的字符、基本词汇、典型语句和语法规则。
字符:ASCII字符基本词汇:符号指令(MOV、ADD)伪指令(DB、SEGMENT等)典型语句:●机器指令语句——对应机器指令的一种操作。
●伪指令语句——无机器语言与之对应,不生成机器指令。
●宏指令语句——一条宏指令对应多条机器指令,产生一组目标代码。
语法规则:基本语法单位(常量、变量、标号、表达式)前面的例子已介绍了源程序的基本结构、格式、名字的定义、语句格式,下面将更深入地介绍有关语法规则。
3.1表达式汇编程序的语句及程序格式都比较固定,语句中除正确选择操作符之外,主要问题在于正确表示操作数地址,这涉及到寻址方式,可以归结到地址表达式的使用。
表达式:由常数、寄存器、标号、变量加上运算符构成的式子。
3.1.1.常量与数值表达式一.常量常量:从源程序翻译成目标程序期间已经有确定数值的量。
用途:赋值、作立即数、位移量。
由常量与运算符组成的式子。
数值表达式在汇编期间进行运算,结果为常量。
汇编期间允许对常量进行3种运算:1.算术运算包括:+、–、*、/、模除(MOD,取余数)、右移、左移。
2.逻辑运算●逻辑乘:AND(与)●逻辑加:OR(或)●按位加:XOR(异或)●逻辑非:NOT(非)3.关系运算包括:相等(EQ)、不等(NE)、小于(L T)、大于(GT)、小于等于(LE)、大于等于(GE)。
运算结果:关系不成立,结果为0;关系成立,结果为–1(0FFFFH)。
如:N = 50M = (N EQ 50)该关系成立,M =–1。
3.1.2.变量、标号与地址表达式一.变量变量:数据存贮单元的名字。
(存放地址的符号表示)。
变量有三个属性:段、EA、类型。
其中类型由定义时的伪指令确定(DB、DW、DD、DT)。
变量的定义:格式:[变量名] 数据定义伪指令表达式[,…]数据定义伪指令:DB、DW、DD、DQ、DT等。
第三章 8086基本语法
(一)通用传送指令
1)最基本的传送指令 格式:MOV dest,src (B/W)
reg reg
sreg sreg
mem mem
data8/data16 功能: dest src 说明:
(1) dest,src类型要一致,不能同时为内 存单元或同为sreg,至少有一个为寄存器, 决定数据位数;
前缀指令指定可用CS、ES、SS)
串操作目的操作数 ES DI
3)寻址方式
对应不同寻址方式,由形式地址计算EA的 方法不同。16位段偏移量可以是8或16位位 移量(Disp8/Disp16)、寄存器值或位移 量加寄存器值。
1)直接寻址
指令直接提供16位EA ( EA= Disp16) 例:设(DS)=2100H,(CS)=1000H, MOV AL,[0158H] 物理地址=(DS)左移4位+Disp=21158H CS:MOV AX,[0158H] 物理地址=(CS)左移4位+Disp=10158H
FAR:段间转移;NEAR:
段内转移(不改变CS值)。
若转移范围在当前指令的-128~+127内,在 操作数前加SHORT。
例2:段间直接转移寻址
JMP FAR PTR START
2)段内寄存器寻址
指令中寄存器内容是转移地址,适用于段 内转移,寄存器可用通用寄存器。
例:JMP BX ;BX IP
2)物理地址的产生
物理地址:单元地址用20位二进制数表 示,CPU与存储器间数据交换用,唯一的。 范围:00000H~FFFFFH
逻辑地址:由段基值和段内偏移量构成, 以16位二进制数表示,编程时用,不唯 一。偏移量范围:0000H~FFFFH
汇编语言学习笔记段寄存器
汇编语言学习笔记段寄存器一、CPU 的典型构成•CPU 中有很多部件,但一般最主要的有:寄存器运算器控制器 ,如下图是CPU 的主要结构:CPU 的典型构成.png(1)寄存器: 存东西的,比如我们做加法计算 20 + 30 ,那么数据20 和30 先存在寄存器中,在运算器中计算后再存储到寄存器中.CPU 中的寄存器,运算器等部件通过CPU中的控制器(总线)与外面的内存等其他部件相连.•对于程序员来说,CPU中最主要的部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制.(汇编学的好不好和寄存器学的好不好直接相关)•不同的CPU,寄存器的个数 \ 结构是不同的,8086 是16位的结构的CPU,但是地址总线是20位,可以访问1M的存储空间.•8086 有14个寄存器(都是16位的寄存器(可以存放2个字节))8086的14个寄存器.png二、通用寄存器•AX BX CX DX 这4个寄存器通常用来存放一般性的数据(eg: int a = 10 , int b =10 ) 称为通用寄存器(有时也有特殊用途).•通常,CPU会先将内存中的数据存储到通用寄存器中,然后在对通用寄存器中的数据进行运算.•假如,内存中有块红色内存空间的值是3,现在想把他加1,并将结果存储到内存中的蓝色内存空间,那么处理流程大致如下:数据操作流程.png1.CPU 首先会将红色内存空间中的值放到 AX 寄存器中(通用寄存器)中,即: movax , 红色内存空间 (将右边边红色内存空间的值存到左边AX 中 )2.然后让AX 寄存器(通用寄存器)与1相加.即: add ax ,1 (将右边的值1,与左边AX中的值相加并将结果存入左边AX中)3.最后将值(结果)赋值给蓝色内存空间.即: mov 蓝色内存空间, AX (将右侧AX中的值移动到左侧蓝色内存中)•AX BX CX DX 这4个通用寄存器都是16位的,可以存储2个字节,如下如: 8086通用寄存器.png•注意: 上一代8086 的寄存器都是8位的,为了保证兼容, AX BX CX DX 都可以分为2个8位的寄存器来使用.如下图:通用寄存器的拆分.png高8位低8位的拆分.png三、字节与字•在汇编的数据存储中,有两个比较常用的单位:字节和字. (相当于高级语言中的 int,long,float等数据类型).因此我们在汇编中只能定义两种数据类型的数据,字节类型(byte类型),字类型(word 类型))字节: byte ,1个byte 由8个bit组成,可以存储在8位寄存器中.字:word,1个字由两个字节组成,这两个字节分别称为字的高字节和低字节. •比如数据20000 (4E20H,01001110 00100000B),高字节值78,低字节值32. 字表示.png•1个字可以存储在一个16位寄存器中,这个字的高字节\低字节分别存储在这个存储器的高8位和低8位寄存器中.四、段寄存器•8086 在访问内存时要由相关部件提供内存单元的段地址和偏移地址送入地址加法器合成物理地址•是什么部件提供段地址? 答:段地址在8086的段寄存器中存放. (段segment )代码段寄存器: CS (code segment) 存放代码的数据段寄存器: DS (datasegment ) 存放数据的堆栈段寄存器: SS (stack segment ) 对象放堆里面,局部对象放栈里面附加段寄存器: ES (Extra segment)8086段寄存器.png•8086 有4个段寄存器,CS DS SS ES,当要访问内存时由这4个段寄存器提供内存单元段地址.•每个段寄存的具体作用是什么呢?一旦程序运行装载到内存当中,所有的代码\全局变量\局部变量\对象都装载到了内存当中,所以内存当中存在具体的代码和数据,也存在堆栈等等 ,那么CPU想访问内存段代码,那么他会访问法代码段寄存器,如果CPU想想问堆栈中的数据那么他会访问栈寄存器,依次类推就是这样的.。
x86汇编语言:从实模式到保护模式笔记(二)
x86汇编语⾔:从实模式到保护模式笔记(⼆)1.我们都知道,8086可以访问1MB内存,其中,0xF0000~9FFFF属于常规内存,由内存条提供;0xF0000~0xFFFFF由主板上的⼀个芯⽚提供,即ROM-BIOS。
这样⼀来,中间还有⼀个320KB的空间,即0xA0000~0xEFFFF。
传统上,这段地址空间由特定的外围设备来提供,其中就包括显卡。
因为显⽰功能对于现代计算机来说实在太重要了。
2.由于历史原因,所有在个⼈计算机上使⽤的显卡,在加电⾃检之后都会把⾃⼰初始化到80*25的⽂本格式。
在这种模式下,屏幕上可以显⽰25⾏,每⾏80个字符(⼀个字符两个字节组成)。
每屏总共2000个字符(4000字节)。
3.⼀直以来,0xB8000~0xBFFFF这段物理地址空间,是留给显卡的。
tip:不允许将⽴即数传送到段寄存器。
4.屏幕上的每个字节对应着显存中的两个连续字节,前⼀个是字符的ASCLL代码,后⾯是字符的显⽰属性,包括字符颜⾊(前景⾊)和底⾊(背景⾊)。
字符的显⽰属性(1字节)分为两部分,低4位定义的是前景⾊,⾼4位定义的是背景⾊。
格式:K R G B + I R B G(K是闪烁位,为0时不闪烁,为1时闪烁;I是亮度位,为0时正常,为1时⾼亮)RGB:(000⿊;001蓝;010绿;011青;100红;101品红;110棕;111⽩)tip:mov指令的⽬的操作数不允许为⽴即数,⽽且,⽬的操作数和源操作数不允许同时为内存单元。
5.在源程序的编译阶段,编译器会把源程序整体上作为⼀个独⽴的段来处理,并从0开始计算和跟踪每⼀条指令的地址。
因为该地址是在编译期间计算的,故称汇编地址。
汇编地址是在源程序编译期间,编译器为每条指令确定的汇编位置,指⽰该指令相对于程序或者段起始处的距离,以字节计。
当编译后的程序装⼊物理内存后,它⼜是该指令在内存段内的偏移地址。
6.在NASM汇编语⾔中,每条指令的前⾯都可以拥有⼀个标号,以代表和指⽰指令所在的汇编地址。
[工学]第2章8086微处理器与汇编语言上
表2-1-2 段寄存器和现行段的对应关系
寄存器 CS DS SS ES
含义 代码段寄存器 数据段寄存器 堆栈段寄存器 附加段寄存器
隐含识别的现行段 现行代码段 现行数据段
现行堆栈段 现行附加段
2021/8/26
19
2.寄存器组
(2)段寄存器组(续)
8086通过CS得到执行指令的段基地址,加上 指令指针IP中的指令偏移量,产生20位的存储 器地址。例如CS=4000H、IP=004AH。那么, 20位物理地址应该是4004AH单元。
2021/8/26
22
2.寄存器组
(4)标志寄存器(续)
① 条件标志位(续)
● AF辅助进位标志位:在运算结果的低4位向 高4位有进位或借位时,AF为“1”;反之, AF为“0”。
● OF溢出标志位:运算结果超出机器表示范 围时,OF为“1”;否则,OF为“0”。带符 号数的操作,若字节运算结果超过-128~+127 范围或者字运算结果超过-32768~+32767范围 时,OF为“1”。
2021/8/26
15
2.寄存器组
(1)通用寄存器组
通用寄存器组由八个16位寄存器构成,按用 途可分为数据寄存器和指针/变址寄存器两大 类 。它们都可以参加算术和逻辑运算。
① 数据寄存器
由四个16位的AX、BX、CX和DX寄存器组 成。每个寄存器可作为一个独立的16位寄存器 使用,也可以分别编址成两个8位寄存器使用。 这样,每个数据寄存器对应的高8位寄存器是 AH、BH、CH和DH;低8位寄存器是AL、BL、 CL和DL。
指令队列状态(输出)。
31
第四节 总线周期
4.总线周期
8086的时钟脉冲(CLK)由时钟发生器(如 8284A)来提供,例如若机器的主频为10MHz, 那么一个时钟周期为100ns。
第四章:8086汇编语言程序设计
第 4章
汇编语言程序设计
汇编语言程序设计
(2)尽量采用循环结构和子程序 (2)尽量采用循环结构和子程序 采用循环结构和子程序可以使程序的长度减少、 采用循环结构和子程序可以使程序的长度减少、 占用内存空间减少。 占用内存空间减少。 多重循环,注意各重循环的初值和循环结束条件, 多重循环,注意各重循环的初值和循环结束条件, 死循环”现象; 避免出现 “死循环”现象; 通用的子程序, 通用的子程序,除了用于存放子程序入口参数的寄 存器外, 存器外,子程序中用到的其它寄存器的内容应压入堆栈 进行现场保护, 进行现场保护,并要特别注意堆栈操作的压入和弹出的 平衡; 平衡; 中断处理子程序除了要保护程序中用到的寄存器外, 中断处理子程序除了要保护程序中用到的寄存器外, 还应保护标志寄存器。 还应保护标志寄存器。
1、汇编语言的语句格式
汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言一般由四部分组成。 汇编语言一般由四部分组成。
其典型的汇编语句格式: 其典型的汇编语句格式: 标号: 标号:操作码
例如: 例如: START: START:MOV AL,30H AL,30H ;(AL)=30H (AL)=30H 30
第 4章
汇编语言程序设计
汇编语言程序设计
经过任务分析、算法优化后, 经过任务分析、算法优化后, 在微型机上使用编 首先, 首先,要对单片机应用 就可以进行程序的总体构思, 就可以进行程序的总体构思, 辑软件编写源程序, 辑软件编写源程序, 系统预完成的任务进行 确定程序的结构和数据形式, 确定程序的结构和数据形式, 在使用交叉汇编的 深入的分析, 深入的分析,明确系统 并考虑资源的分配和参数的 方法对源程序进行 的设计任务、 的设计任务、功能要求 计算等。 计算等。然后根据程序运行 汇编, 汇编,然后采用串 和技术指标。其次, 和技术指标。其次,要 的过程, 的过程,勾画出程序执行的 算法是解决具体问题 行通信的方法, 行通信的方法,把 对系统的硬件资源和工 逻辑顺序, 。同一个问题 逻辑顺序,用图形符号将总 的方法。 的方法 汇编得到的目标程 作环境进行分析。 ,, 作环境进行分析。这是 体设计思路及程序流向绘制 的算法可以有多种, 的算法可以有多种 序传送到单片机内, 序传送到单片机内 单片机应用系统程序设 在平面图上, 在平面图上,从而使程序的 结果也可能不尽相同, 结果也可能不尽相同, 并进行程序运行和 计的基础和条件 结构关系直观明了, 结构关系直观明了,便于检 所以, 调试 所以,应对各种算法 查和修改。 查和修改。 进行分析比较,并进 进行分析比较, 行合理的优化
(汇编语言教程)5_80868088汇编语言-2
104H DUP(11H 104H DUP(11H)
DUP( DUP(0)
ENDS
ENDS DATA2 DATA2 SEGMENT PARA DB COMMON ‘DATA2’ DATA2 DATA N2 DATA2 DATA2 105H DUP( 105H DUP(0)
DATA2 DATA2 N1 DATA2 DATA2 END
默认值为: 默认值为:PARA
III、 III、组合类型
段名 SEGMENT [定位类型] [组合类型] [使用类型] [‘类别’] 定位类型] 组合类型] 使用类型] [‘类别 类别’ …… …… ; 语句序列 段名 ENDS
PRIVATE:私有段,不进行组合。 PUBLIC:
– 不同模块中的同为public属性的同名段连接组合成一个逻辑段。
3、过程定义伪指令
格式: 格式:过程名 [类型 类型] PROC [类型] … 过程体语句 RET 段名 ENDP PROC和ENDP是成对出现的 是成对出现的。 PROC和ENDP是成对出现的。 类型有近(NEAR)和远(FAR)两种, 类型有近(NEAR)和远(FAR)两种,若过程缺省 NEAR缺省 则属默认值。若为远过程, FAR不 缺省, 或NEAR缺省,则属默认值。若为远过程,则FAR不 能省略。 能省略。 过程名具有段地址、 过程名具有段地址、段内偏移量和类型三个属 性。
2、源程序开始和结束伪指令
程序开始伪指令
– NAME伪指令 NAME伪指令 – TITLE伪指令 TITLE伪指令
程序结束伪指令
– END
(1)程序开始伪指令NAME 程序开始伪指令NAME
NAME伪指令 NAME伪指令 格式: 格式:NAME 模块名 含义:表示一个模块的开始, 含义:表示一个模块的开始,并给出该模 块名。 块名。
8086汇编语言学习(六)8086处理结构化数据(模拟高级语言结构体、数组)
8086汇编语⾔学习(六)8086处理结构化数据(模拟⾼级语⾔结构体、数组)⼀、8086汇编定义数据 要处理结构化数据,必须先定义数据。
8086汇编作为⼀门编程语⾔,定义数据的⽅式⽐起复杂的⾼级语⾔要简单不少。
汇编语⾔贴近机器底层,所处理的数据逻辑上都可以视为⼆进制数据,按照对不同⼤⼩内存单元的处理,分为三种:db、dw、dd。
1.db db 即define byte,定义⼀个字节变量。
例如 db 1h,代表着db指令后的值占⽤⼀个字节的内存空间 1h=>01h。
特别的,使⽤db可以⽐较简单的定义字符串数据,例如db "ABC",代表着定义A、B、C三个连续的字符。
2.dw db 即define word,定义⼀个字变量。
例如 dw 1h,代表着dw指令后的值占⽤⼀个字/两个字节的内存空间 1h=>0001h。
3.dd dd 即define doubleword,定义⼀个双字变量。
例如 dd 1h,代表着dw指令后的值占⽤两个字/四个字节的内存空间 1h=>0000 0001h。
在连续定义数据时,可以通过逗号进⾏缩写。
例如 db 1h,2h,3h等价与db 1h;db 2h;db 3h。
同时上述三种⽅式都可以与dup关键字(duplicate)使⽤。
例如,定义3个值为1h的字形数据,可以写为dw 3 dup(1h),其等价于dw1h,1h,1h。
在定义复数个相同的数据时,可以简化程序,增强可读性。
db、dw、dd、dup都属于8086汇编的伪指令,由汇编器在编译时进⾏处理,并没有对应的机器指令。
⼆、8086汇编处理结构化数据 之前介绍了8086各种不同⽅式的内存寻址⽅式,下⾯介绍8086如何利⽤这些多样的寻址⽅式来处理结构化的数据。
举⼀个简单的例⼦,假设存在⼀个结构化的数据(公司),拥有五个属性。
公司属性: 公司名称: BLZ 总裁名称: Deckard Cain 公司排名: 15 年收⼊(亿元): 50 产品: WOW 需求是,在内存中定义该数据并且对其中的部分属性进⾏修改,将公司排名修改为10,年收⼊修改为80,产品名称修改为OWO。
8086汇编语言学习(一)8086汇编介绍
8086汇编语⾔学习(⼀)8086汇编介绍1. 学习汇编的⼼路历程 进⾏8086汇编的介绍之前,想先分享⼀下我学习汇编的⼼路历程。
rocketmq的学习 其实我并没有想到这么快的就需要进⼀步学习汇编语⾔,因为汇编对于我的当前的⼯作内容来说太过底层。
但在⼏个⽉前,当时我正尝试着阅读rocketmq的源码。
和许多流⾏的java中间件、框架⼀样,rocketmq底层的⽹络通信也是通过netty实现的。
但由于我对netty并不熟悉,在⼯作中使⽤spring-cloud-gateway的时候甚⾄写出了⼀些导致netty内存泄漏的代码,却不太明⽩个中原理。
出于我个⼈的习惯,在学习源码时,抛开整体的程序架构不论,希望⾄少能对其中涉及到的底层内容有⼀个⼤致的掌握,能让我像⿊盒⼦⼀样去看待它们。
趁热打铁,我决定先学习netty,这样既能在⼯作时更好的定位、解决netty相关的问题,⼜能在研究依赖netty的开源项⽬时更加得⼼应⼿。
netty的学习 随着对netty学习的深⼊,除了感叹netty统⼀规整的api接⼝设计,内部交互灵活可配置、同时⼜提供了⾜够丰富的开箱即⽤组件外;更进⼀步的,netty或者说java nio涉及到了许多更底层的东西,例如:io多路复⽤,零拷贝,事件驱动等等。
⽽这些底层技术在redis,nginx,node-js等以⾼效率io著称的应⽤中被⼴泛使⽤。
扪⼼⾃问,⾃⼰在多⼤程度上理解这些技术?为什么io多路复⽤在io密集型的应⽤中,效率能够⽐之传统的同步阻塞io显著提⾼?⼀次⽹络或磁盘的io传输内部到底发⽣了什么,零拷贝到底快在了哪⾥? 如果没有很好的弄明⽩这些问题,那么我的netty学习将是不完整的。
我有限的知识告诉我,答案就在操作系统中。
操作系统作为软硬件的⼤管家,对上提供应⽤程序接⼝(程序员们通常使⽤⾼级语⾔提供的api间接调⽤);对下控制硬件(cpu、内存、磁盘⽹卡等外设);依赖硬件提供控制并发的系统原语;其牵涉的许多模块内容都已经独⽴发展了(多系统进程间通信->计算机⽹络、⽂件系统->数据库)。
IBM—PC(80x86)汇编语言与接口技术-第2章 80x86计算机组织
• 80386是1985年研制出的一个32位微处理器, 内部及外部数据总线均为32位,地址线也为32 位,因此它可处理4G(232)字节的物理存储 空间。
• 1989年Intel公司又研制出新一代的微处理器 80486,80486芯片内除了有一个与80386相同 结构的主处理器外,还集成了一个浮点处理部 件FPU以及一个8K字节的高速缓冲存储器 (cache),使80486的计算速度和总体性能比 80386有了明显的提高。
• Intel公司在1982年推出了80286微处理器,它仍 然是16位结构。80286的内部及外部数据总线都 是16位的,但它的地址线是24位的,可寻址16M 字节的存储空间。
80286有两种工作方式,即实模式和保护模式: 实模式与8086工作方式相同,但速度比8086快。
保护模式除了仍具有16M字节的存储器物理地址空 间外,她还能为每个任务提供1G字节的虚拟存储 器地址空间。保护方式把操作系统及各任务所分配 到的地址空间隔离开,避免程序之间的相互干扰, 保证系统在多任务环境下正常工作。
• 8086是1978年Intel公司推出的16位微处理器。
(1)8086有16位数据总线,处理器与外部传送数据 时,一次可传送16位二进制数。
(2)8086有20位地址总线,寻址空间提高到1M字节。
(3)8086采用了流水线技术,可以实现处理器的内 部操作与存储器或I/O接口之间的数据传送操作重叠 进行,从而提高了处理器的性能。
2.2 基于微处理器的 计算机系统的构成
硬件:
中央处理机 CPU
总线控制 逻辑 系 统 总 线
存储器
接口
...
接口
大容量 存储器
...
I/O设备
I/O子系统
8086汇编语言学习(二)8086汇编开发环境搭建和Debug模式介绍
8086汇编语⾔学习(⼆)8086汇编开发环境搭建和Debug模式介绍1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语⾔。
⼯欲善其事,必先利其器,在8086汇编语⾔正式开始学习之前,先介绍⼀下如何搭建8086汇编的开发环境。
汇编语⾔设计之初是⽤于在没有操作系统的裸机上直接操作硬件的,但对于⼤部分⼈来说,在8086裸机上直接进⾏编程将会⾯临各种困难。
好在我们可以使⽤软件模拟器来模拟硬件进⾏8086的学习实践。
在《汇编语⾔》中作者推荐通过windows环境下的masm和debug进⾏学习。
masm介绍: masm是⼀款DOS下的汇编⼯具包,在8086汇编的学习中我们需要其中的⼏个⽂件,分别是masm.exe,link.exe。
masm.exe 汇编器,⽤于将⽂本格式的汇编语⾔源⽂件编译为.obj结尾的⼆进制⽂件,其⽣成的.obj结尾的⼆进制⽬标⽂件是被编译的源⽂件的对应的机器码。
单独的源程序⽬标⽂件通常是⽆法直接运⾏的,还需要和互相依赖的其它同样编译完成的⼆进制⽂件链接在⼀起才能⽣成最终的可执⾏⽂件(⽐如所需要的静态库函数) 。
因此,obj⽂件通常也被叫做中间⽂件。
link.exe 链接器,obj⽂件需要通过链接才能转换成可执⾏程序,⽽链接器就是负责完成这⼀任务的。
链接器能将多个obj⽬标⽂件以及其所依赖的库程序进⾏统⼀处理(例如多个⽬标⽂件中指令、数据内存地址的偏移处理),并⽣成可执⾏⽂件。
debug介绍: debug.exe 调试器,windows提供了⼀个在dos中调试8086汇编程序的⼯具debug.exe,提供了展⽰程序运⾏时CPU中各寄存器、内存中数据,指令级的单步调试等功能。
debug程序的使⽤会在本篇博客的后半段进⾏详细介绍。
64位操作系统兼容性问题: 由于《汇编语⾔》⼀书出版较早,当时的windows系统还是32位的,32位windows系统都默认安装了masm与debug,能打开dos窗⼝直接使⽤。
8086_8088汇编语言中的进位和溢出
进位与溢出无符号数运算主要考虑进位/借位问题,而有符号数的运算主要考虑溢出问题。
两个有符号数进行加减运算时,如果运算结果超出了该符号数可表示的范围,就会发生溢出,使计算出错。
1.无符号数运算时的借位当最高位向更高位有进位(或借位)时,即CF=1时,运算结果会超出该无符号数字长所表示的范围。
11111100+ 00000111+ 1 000000118位无符号数的表示范围为0~255,上例中,被加数为252,加上7就超出了8位无符号数的表示范围,向更高位有进位,运算的结果导致CF=1,8位数据不能反映两数相加的和。
2.有符号数运算时的溢出最高位进位状态⊕次高位进位状态=1,则溢出。
怎么理解呢?首先要知道⊕(异或)是什么:相同为0,相异为1;然后是“状态”一词,状态指的是有没有进位。
这句话的意思就是:若最高位和次高位中,一个有进位而另一个没有进位,则异或结果为1,表示有符号的运算结果有溢出,此时OF置1。
来看一下微机原理里面判断OF位的经典例题:将10011100和11100101相加后,标志寄存器中OF为何值?首先,我们都知道OF为溢出标志位(有溢出为1,无溢出为0);然后,他的定义就是判断补码运算时的溢出情况,既然是补码,那就一定是有符号数。
那就用判断有符号数溢出的方法判断,先进行运算:10011100+ 11100101+ 1 10000001由此看出,最高位有进位,次高位也有进位,则没有溢出,所以OF=0。
总之,要始终牢记一点:CF是无符号数溢出标志(暂且也称为溢出),OF 是有符号数溢出标志。
通俗一点说就是,即使有符号数相加/相减导致了CF=1,不能说明结果的正确与否。
此时,若OF=1,则说明结果溢出,出现错误;OF=0,说明结果正确。
这个判断过程根本和CF没关系,CF=1/0,都不会影响。
同理也可以得出OF对无符号数的运算结果判断也无影响。
汇编语言重点知识总结
汇编语言重点知识总结汇编速查手册汇编语言总结概要寄存器与存储器1. 寄存器功能. 寄存器的一般用途和专用用途. CS:IP 控制程序执行流程. SS:SP 提供堆栈栈顶单元地址. DS:BX(SI,DI) 提供数据段内单元地址. SS:BP 提供堆栈内单元地址. ES:BX(SI,DI) 提供附加段内单元地址. AX,CX,BX 和CX 寄存器多用于运算和暂存中间计算结果,但又专用于某些指令( 查阅指令表)。
. PSW 程序状态字寄存器只能通过专用指令( LAHF, SAHF) 和堆栈(PUSHF,POPF) 进行存取。
2. 存储器分段管理. 解决了16 位寄存器构成20 位地址的问题. 便于程序重定位. 20 位物理地址= 段地址* 16 + 偏移地址. 程序分段组织: 一般由代码段, 堆栈段,数据段和附加段组成, 不设置堆栈段时则使用系统内部的堆栈。
3. 堆栈. 堆栈是一种先进后出的数据结构, 数据的存取在栈顶进行, 数据入栈使堆栈向地址减小的方向扩展。
. 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果。
. 堆栈总是以字为单位存取指令系统与寻址方式1. 指令系统. 计算机提供给用户使用的机器指令集称为指令系统, 大多数指令为双操作数指令。
执行指令后,一般源操作数不变,目的操作数被计算结果替代。
. 机器指令由CPU 执行,完成某种运算或操作,8086/8088 指令系统中的指令分为6 类: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。
2. 寻址方式. 寻址方式确定执行指令时获得操作数地址的方法. 分为与数据有关的寻址方式(7 种) 和与转移地址有关的寻址方式(4)种。
. 与数据有关的寻址方式的一般用途:(1) 立即数寻址方式--将常量赋给寄存器或存储单元(2) 直接寻址方式-- 存取单个变量(3) 寄存器寻址方式--访问寄存器的速度快于访问存储单元的速度(4) 寄存器间接寻址方式--访问数组元素(5) 变址寻址方式(6) 基址变址寻址方式(7) 相对基址变址寻址方式(5),(6),(7) 都便于处理数组元素. 与数据有关的寻址方式中,提供地址的寄存器只能是BX,SI,DI 或BP . 与转移地址有关的寻址方式的一般用途:(1) 段内直接寻址-- 段内直接转移或子程序调用(2) 段内间接寻址-- 段内间接转移或子程序调用(3) 段间直接寻址-- 段间直接转移或子程序调用(4) 段间间接寻址-- 段间间接转移或子程序调用汇编程序和汇编语言1. 汇编程序. 汇编程序是将汇编语言源程序翻译成二进制代码程序的语言处理程序, 翻译的过程称为汇编。
8086汇编语言学习(三)8086中的段和栈
8086汇编语⾔学习(三)8086中的段和栈1. 8086汇编中的段段地址 8086对内存寻址的⽅式是通过段地址*16+偏移地址的⽅式实现的,⽽在16位的8086CPU下,段地址和偏移地址也都是16位的。
这意味着,对于任意⼀个段,段的起始地址必定为16的倍数(段地址*16)。
对于同⼀个内存地址,存在多种不同的内存寻址⽅式: 例如:段地址1000H+偏移地址2345H,与段地址1234H+偏移地址0005H都可以对内存地址12345H进⾏寻址(段地址1204H+偏移地址0305H等等也可⾏,⾮常⾃由)。
段的最⼤空间为2^16bit=64KB(例如:将段地址设为1000H,将段的⼤⼩设置为64KB,则段的内存范围为10000H-1FFFFH)。
段的最⼩空间为2^4bit=16bit (例如:将段地址设为1234H,将段的⼤⼩设置为16bit,则段的内存范围为12340H-1234FH)。
段的逻辑意义 需要注意,内存段的概念并不是内存硬件所固有的,⽽是从CPU寻址的⾓度出发,将内存中的物理连续区域逻辑上分隔为不同的区域。
内存段这⼀概念的提出有利于在复杂程序、多程序系统中对同⼀程序的不同逻辑部分以及不同程序的内存进⾏更好的访问和管理。
段寄存器 内存段的存在能够划分同⼀程序中的不同逻辑部分,进⾏更有效的管理和更简单的访问。
汇编程序的内存通常可以被划分为三部分:代码、栈以及数据。
通常为了避免混淆,会将这三种不同的逻辑部分分别存放在三个不同的内存段中,便于理解(当然也能将同⼀部分的内存存放在不同的段中,这主要取决于程序的复杂程度)。
8086CPU提供了对代码、栈、数据三种内存段访问的段寄存器,分别是代码段寄存器CS、栈段寄存器SS、数据段寄存器DS以及附加段寄存器ES。
代码段寄存器CS 代码段寄存器CS在前⾯的博客中已经有过介绍,CPU在运⾏时会将CS:IP指向的内存中的数据当作指令来执⾏。
栈段寄存器SS 执⾏栈相关的指令时,CPU通过SS:SP获得当前栈顶指针。
微机原理8086汇编语言程序设计
;这是一个乘10子程序
;使用寄存器AX
;入口:AX,出口:AX
proc far
push bx
;保护现场
pushf
add ax,ax
;2ax
功
mov bx,ax
;2ax ?bx
能
add ax,ax
;4ax
程
add ax,ax
;8ax
序
add ax,bx
;10ax
段
popf
;恢复现场
pop bx
ret
endp
第四章 8086汇编语言程序设计
? 几个概念 ? 8086汇编语言的语句 ? 8086汇编中的伪指令 ? 8086汇编中的运算符 ? 汇编语言程序设计 ? 宏定义与宏调用 ? 系统调用
几个概念
? 汇编语言 ? 汇编语言源程序 ? 汇编 ? 汇编程序
4.1 8086汇编语言的语句
汇编语言由指令性语句和指令性语句组成 ? 一、指令性语句格式
CODE SEGMENT
;定义代码段
ASSUME DS:DATA , CS: CODE
START: MOV AX , DATA
;初始化DS
MOV DS , AX
……
MOV AX , 4C00H ;返回DOS
INT 21H
CODE ENDS
;代码段结束
END START
;源程序结束
;段属性说明
? 特点 ? 程序分段 ? 语句由指令性和指示性语句组成 ? 两种程序框架
? 3、 ORG伪指令、地址计数器 $
ORG伪指令格式: ORG <表达式>
? 4、END 表示源代码结束 格式为: END 常数或表达式.
8086汇编语言学习(七)8086跳转指令
8086汇编语⾔学习(七)8086跳转指令8086跳转指令 ⽬前为⽌,我们的程序的指令执⾏都是线性的,从上到下,由CPU⾃动的增加IP的值,顺序的执⾏指令。
但对于复杂的需求,只有线性的指令执⾏⽅式是远远不够的。
对于⾼级语⾔,有着如if/else的逻辑跳转分⽀,如for/while的循环结构,还有函数⼦程序的调⽤与返回等等。
正是有了这些能够控制程序执⾏指令的不同⽅式,才能具有⾜够的表达能⼒,满⾜⾜够复杂的需求,成为⼀门图灵完备的语⾔。
那么上述的逻辑跳转、循环,在基于图灵机的CPU硬件上是如何实现的呢?通过8086汇编的跳转指令的学习,我们得以⼀窥究竟。
CPU是通过CS:IP来获取下⼀条指令的值,那么通过指令修改CS、IP这两个寄存器的值,便可以控制CPU所执⾏的指令了。
可由于控制CPU执⾏指令的CS、IP⼗分的关键,因此8086并不允许像其它普通的寄存器⼀般使⽤mov等指令对CS、IP修改(mov IP,1000H是⾮法的),⽽是提供了专门的指令来控制CS、IP的值,这⼀类指令被称为8086跳转指令。
跳转指令按照类型可以分为五种:⽆条件跳转指令、有条件跳转指令、循环指令、过程调⽤与返回指令以及中断指令。
⽆条件跳转指令(jmp) jmp既可以只修改IP,也可以同时修改CS和IP。
作为跳转指令,在编程时需要指定跳转的位置,进⽽修改CS/IP的值。
段内转移 段内短转移(IP 变化-128~127):段内短转移的格式为 jmp short [标号]。
assume cs:codesgcodesg segmentstart:mov ax,0jmp short sadd ax,1s:inc axcodesg endsend start 段内近转移(IP 变化-32768~32767):当所要跳转的间隔⼤于短转移的时候,就需要使⽤段内近转移。
段内近转移和短转移类似,格式为 jmp near ptr [标号]。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
后转到寄存器所指的 ip 处执行。
call word ptr 内存单元地址:把本指令(指 call word ptr 内存单元地址)下一
条指令的 ip 压入 sp,然后转到内存单元地址所指的 ip 处执行。
call dword ptr 内存单元地址:把本指令(指 call dword ptr 内存单元地址)下
7、如果某个地址的段地址是 ds,偏移地址是 bx+200,则要将这个位置的数据传到
ax 中,可以这样:
mov ax,[bx+200]或者 mov ax,200[bx]或者 mov ax,[bx].200
偏移地址也可以改为 bx+si 或者 bx+di,此时的格式:
mov ax,[bx+si]或者 mov ax,[bx][si]
(ax)/((es)*16+0)的余数
div word ptr [bx+si+8],该指令的结果:(ax) =
[(dx)*10000H+(ax])/((ds)*16+bx+si+8)的商,(dx) =
[(dx)*10000H+(ax])/((ds)*16+bx+si+8)的余数
div bx,该指令的结果:(ax) = [(dx)*10000H+(ax])/(bx)的商,(dx) =
或者 mov ax,126 e 1000:0000 01 02 03 04,表示将 01 02 03 04 顺序填入 1000:0000 表示的内存处 u 1000:0,可以查 1000:0 内存处的数据及其对应汇编指令 t,执行 cs:ip 寄存器所指的指令 g 0012,从 cs:ip 执行到 cs:0012 处,中间不停顿 p ,遇到 loop 循环,则一次把所有循环执行完再退出。 二、各寄存器的作用 1、ax,bx 等一般寄存器,可暂存数据 2、cs,ip 下一条要执行的指令存储在 cs 为段地址,ip 为偏移地址的内存中 3、ds 数据段寄存器,比如 mov al,[0],表示将 ds:0 这个内存中的数字传入 al 中。 要将内存 10000H 中的数传入 al 中,则应该这样: mov ax,1000 mov ds,ax ,因为不能直接 mov ds,1000 mov al,[0],寄存器 al 若为 16 位,则内存中有一个字要移入 al,要是为 32 位,
15、子程序调用中的参数及返回值
当参数或者返回值只有 1 个或者 2 个时,可以把参数及返回值放到寄存器当中,但
是当参数及返回值有 N 个时,则把批量数据放到内存中,然后把它们所在内存空间的
首地址放在寄存器中
,然后传递给需要的子程序或者主程序。当然也可以用堆栈来传递参数及结果。
16、mul 指令
围为:-128~127
loop 标号:(cx)=(cx)-1,如果(cs)!=0,则转到标号处开始执行,否则顺序向下执
行。此处转移条件和 jcxz 正好相反。
12、ret 和 retf 指令
ret 指令后,(ip)= (sp),(cs)不变,然后(sp) = (sp ) +2,该指令实现近转移,
则内存中有 2 个字要移入 al mov bl,[ax],将 ds:ax 表示的内存的字节传入 bl 寄存器中 mov bx,[ax],将 ds:ax 表示的内存的字传入 bx 寄存器中 4、ss,sp ss 存储堆栈段的段地址,sp 存储堆栈段的偏移地址,push 和 pop 指令涉及到的内
改 CS 和 IP。
jmp 16 位寄存器:其中 IP 地址放在 16 位寄存器中。
jmp word ptr 内存单元地址:其中内存单元地址存放的是 IP 的值。假如 ds:[0]这
个内存单元值为 0123H,则 jmp word ptr ds:[0]表示下一条指令执行地址为
cs:0123H
jmp dword ptr 内存单元地址:其中内存单元地址存放着 2 个字,高地址为 CS,低
地址为 IP。比如:
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:2,0
jmp dword ptr ds:[0] 执行后,(CS)=0,(IP)=0123H
如 inc word ptr ds:[0] 用 byte ptr 标明这是字节操作,这是在 masm 中的用法,比如 inc byte ptr ds:[0] c、push [1000H],不用指明,直接进行字操作
四、各种指令 1、mov,移动,比如 mov ds,ax 将 ax 中的数据移入 ds 中 2、add,加法,比如 add ax,bx,将 bx 中的值与 ax 中的值相加并存入 ax 中 3、sub,减法,比如 sub ax,bx,将 ax 中的值减去 bx 中的值并存入 ax 中 4、push,入栈,比如 push ax,将 ax 寄存器中的值压入堆栈 ss:sp 指向的内存当中,
[(dx)*10000H+(ax])/(bx)的余数
9、jmp 指令
a、jmp short 标号:段内短转移,只能在一个段内转移,并且转移的距离范围是
-128~127
jmp near ptr 标号:段内近转移,转移距离为-32768~32767
jmp far ptr 标号:段间转移,far ptr 指明了指令用标号的段地址和偏移地址修
并把 sp 的值改为 sp-2(这是在 8086 当中,因为 ax 是 16 位寄存器,而内存单元为 8 位,因此一个寄存器的值要用两个内存 单元来存放) 5、pop,出栈,比如 pop ax,将 ss:sp 指向的内存的值送入 ax 中,并把 sp 的值改 为 sp+2 pop [0],将 ss:sp 内存中的数据弹出到 ds:0 内存中,注意 pop 操作是字为单位的操 作 6、注意 push 和 pop 指令中的超栈的界限问题 7、inc bx 将 bx 中的值加 1。 8、dec bx 将 bx 中的值减 1。和 inc bx 正好相反。 五、microsoft asm 格式下的各种命令: 0、一个程序要编译运行的基本架构: assume cs:code code segment start: .... mov ax,4c00H int 21H code ends end 这几行是基本的,不然程序无法编译运行。 1、程序完后要输入 mov ax,4c00H int 21H 帮助程序返回。 2、利用 loop 实现循环 mov cx,11,将 cx 寄存器值置为 11 s:add ax,ax,执行 ax=ax+1 add bx,bx,执行 bx=bx+1 loop s,执行 cx=cx-1,cx==0,则往下,cx!=0,则转到 s 标记的内存地址中继续 执行 3、在汇编程序中,数据不能由字母开头,故 mov ax,FFFFH 不合法,要改为 mov ax,0FFFFH 4、debug 中 mov ax,[0]表示将 ds:[0]内存中的值送入 ax 中 在 masm 汇编源程序中, mov ax,[0],表示将 0 送入 ax 中 在源程序中可修改为:mov ax,ds:[0]或者 mov ax,[bx]或者 mov ax,cs:[0]这里的 cs,ds 就是显示的指定段寄存器,一般默认段寄存器为 ds 5、end start 在 masm 中表示汇编程序在 start 指定的地方开始执行,要是 end d, 则表示在 masm 中汇编程序在 d 标号指定的地方开始执行
mul bl,mul byte ptr ds:[0],表示进行的是 8 位乘法,其中乘数放在 al 中,被乘
数放在 bl 或者内存单元中,结果放在 ax 中
mul bx,mul word ptr ss:[0],表示进行的是 16 位乘法,其中乘数放在 ax 中,被乘
数放在 bx 或者内存单元中,结果存放方式为:
10、jcxz 指令
这是有条件转移指令,所有的有条件转移指令都是短转移,即在段内转移。该指令
对 IP 的修改范围为:-128~127
jcxz 标号:如果(cs)=0,则转到标号处开始执行,否则顺序向下执行。
11、loop 指令
这是循环指令,所有的循环指令都是短转移,即在段内转移。该指令对 IP 的修改范
即弹出堆栈 sp 中的值作为 ip 的值
retf 指令后,(ip)= (sp),(cs)= (sp)+2,然后(sp) = (sp)+4,即先弹出 ip 的值,
再弹出 cs 的值,即保存时先 push cs,再 push ip,该指令实现远转ll 标号:把本指令(指 call 标号)下一条指令的 ip 压入 sp,并转到标号处执行。
存就是 ss:sp 指向的内存 5、cx 计数寄存器,主要是存储循环程序要循环执行的次数。存放程序在内存中的
长度? 6、注意段寄存器 cs,ds,ss 均不能直接将数据输入。 7、在 mov ax,[si+di]这个[。。。]省略号只能填入如下四个寄存器:bx,si,di,bp,
其余的比如 ax,cx,dx 均是错误的,要是 ss,cs,ds,更是错误的。 在[。。。]中使用 bp,则段地址默认为 ss,显性指示段地址除外。 三、内存相关部分参见二 1、 a、mov al,[ax],其中的 al 指明是字节操作,即一次只移动一个字节的内存 mov ax,[0],其中的 ax 指明是字操作,即一次移动一个字的内存 b、若没有寄存器,则可以使用 word ptr 标明是字操作,这是在 masm 中的用法,比
高位放在 dx 中,低位放在 ax 中,其值为 dx*16+ax