《网络与系统攻防技术》第二周作业-汇编语言

汇编语言程序设计

电子科技大学

dky 20192414 袁浩然


第一章 基础知识

1. 程序设计语言

  • 机器语言

       机器语言就是把控制计算机的命令各种数据直接用二进制数码表示的一种程序设计语言

       对人不好理解

       01字符串代码 简单运行快但是不好理解
  • 高级语言

       屏蔽很多操作细节,更像自然语言

       简单但是效率低
  • 汇编语言

       在一些场合,必须使用(我学这么课为了反汇编)
    4*60+40
    MUL BL
    ADD AL,CL

       汇编语言与CPU与密切联系(本课程使用IBM-PC系列)

2.学习和使用汇编语言目的(画饼)

  • 根本上认识、理解计算机工作过程
  • 某些系统必须使用汇编程序实现
  • 效率高于高级语言程序

3.进位计数制及其相互转换

  • 进位进数制

       ep:10进制 8进制

       各个位置上的基本数值成为位权

       每个数位上能使用不同数码的个数位基数

      每个数位能取的最大数码值=基数-1

      二进制一般书写位8进制和16进制

      用数的尾部表示进制
    B(二进制) O(八进制) D(没有默认十进制)(十进制) H(十六进制)
  • 各种数制间的相互转换

      略(这个我会)

4.带符号数的表示


  真值:用+或-的数叫做真值

  机器数:用0或1表示正负的机器数

  原码 反码 补码

5.字符的表示


  最广泛采用的是ASCII码低。低七位是字符编码,第八位是奇偶校验。

  ASCII码有128个,两类。非打印ASCII码有33个。可打印ASCII码有95个。

6.基本逻辑运算

  • 运算 AND

      F=a^b或F=a·b
  • 运算 OR

      F=aVb或F=a+b
  • 运算
  • 异或运算 XOR

第二章 IBM-PC微机的功能结构

1.IBM-PC微机基本结构

  • 五大部件

      运算器 控制器 存储器 输入输出设备

      运算器+控制器=CPU(微处理器)
  • 采用总线结构(三类总线)

      地址总线 数据总线 控制总线

      可以之间相互连接(进行控制和相互传输)
  1. CPU
  2. 主存储器

      一个字节由八个二进制表示-一般一个字节是一个存储单元

      一个存储器由多个存储单元组成 从0000000000到1111111111

      习惯上将CPU和主存储器成为主机

      主机之外的存储,叫做辅存或外存
  3. 输入输出设备及接口

      I/O设备需要通过I/O接口和系统总线连接
  4. 系统总线
  • Inter 8086/8088 CPU的功能结构

      主要有两步 取指令 执行指令
  1. 串行方式

      CPU三个操作 取指 执行 存数

      系统总线对应 忙 闲 忙
  2. 指令流水线方式

      CPU分为两个部分执行单元(EU)总线接口单元(BIU)

      EU里面有通用寄存器、算数逻辑单元(ALU)、暂存器、标志寄存器、EU控制器。

      BIU里面有段寄存器(寻址,作为逻辑地址里面的基址)、16位数据总线、20位地址总线

      EU负责取出指令代码,对操作数执行各种指定的算数或逻辑运算以及向BIU发送访问主存或I/O的命令

      BIU负责CPU与存储器、I/O的信息传送。主要负责:取指令、存取数据。

      两个分工又合作的两个部分。


  BIU取指取数存数,EU执行。总线几乎一直在忙。

Inter 8086/8088CPU寄存器结构及其用途

  • 一共十四个寄存器

      AX(AH AL)累加器

      BX(BH BL)基址寄存器

      CX(CH CL)计数寄存器

      DX(DH DL)数据寄存器

      (以上四个H表示高位,L表示低位)

      堆栈寄存器 SP

      基址指针 BP

      源地址寄存器 SI

      目的地址寄存器DI

    (以上八个为通用寄存器

      指令指针(IP)

      标志寄存器(FLAGS)

    (以上两个为控制寄存器

      代码寄存器(CS)

      数据段寄存器(DS)

      附加段寄存器(ES)

      堆栈段寄存器(SS)

    (以上四个为段寄存器
  • 通用寄存器
  1. 数据寄存器

      AX每个都是16位寄存器

      例MOV AX,BX; ADD CH,DH;

      有些时候不需要明确指出寄存器的名称。比如LOOP中CX隐含指定。
  2. 指针寄存器

      存放16位地址,作为偏移量使用。

      SP指针在堆栈操作隐含使用,指向堆栈底部

      BP指令,指向堆栈某一处
  3. 变址寄存器

      作为地址指针
  • 段寄存器

      使用存储器,划分为若干个段

      每个段芳不同的内容,入程序代码和数据等等

      存储段用一个段寄存器来指令段的起始位置

      由低->高 代码段 数据段 堆栈段 附加段

      CPU访问存储器必须指明 属于哪个段和偏移量

  • 指令指针

      IP的内容作为偏移量。

      CPU从内存中取出一条指令后,IP内容自动修改为指向下一条指令。

      IP内容补鞥呢直接访问,但是可以通过某些指令的执行而自动修改IP的内容。

  • 标志寄存器

      长度16位,但是只定义了其中的9位。

      溢出位 方向位 中断允许位 单步标志位 符号位 零值位 辅助进位位 奇偶位 进位位

      分为标志状态和控制状态

      CF进位标志位 产生进位或错位CF自动置为1 移位指令中存放最高位或最低位移除的值

      PF奇偶标志位 第八位1的个数偶数为1

      AF辅助进位标志位 第三位产生进位或借位为1

      ZF零值标志位 全零为1

      SF符号标志位 结果为负数SF为1

      OF溢出标志位 超出补码表示的范围为1

        计算-85D+(-1D)=-86D

        产生进位 CF=1 OF=0

        计算100D+100D=200D

        发生溢出 CF=0 0F=1

        计算-85D+-117D=-202D

        发生进位和溢出 CF = OF =1

      TF单步标志位 供调试程序使用

      IF中断允许标志位 为1可以相应可屏蔽中断

      DF方向标志位 串操作指令的增减方向 DF=0 内容递增

存储器的组织结构

存储器的组成


  存储器是由若干存储单元构成 单元多少决定容量

  每个存储单元存放相同长度二进制数 一般为8位二进制数(一个字节)

  每个存储单元有一个唯一的地址编号 有20个地址线(即20位地址码)

   地址用5个十六进制数表示

  任何两个相邻字节单元构成一个字单元 16位长数据存放:低8位放在低字节单元,高8位存放在高字节单元

    3456H 存放 56 34

  在定义一个地址时必须指出是字节还是字类型属性

存储器的段结构

存储器的段结构有以下特点
  • 存储空间分为若干段,一个段最大长度4K(65536)
  • 段基址必须是一个小节的首址
  • 逻辑段在物理存储器可以是邻接的、间隔的、部分重叠的和完全重叠的
  • 在任一时间段,一个程序只能访问4个当前段中的内容

      四个段分别为代码段、数据段、堆栈段和附加段(称为当前段)

逻辑地址与物理地址对应关系

物理地址


  每个物理地址是唯一的,从00000H到FFFFFH

逻辑地址


  逻辑地址包括段基值偏移量

  • 段基值:存放在段寄存器中,是起始单元地址的高十六位
  • 偏移量:某个存储单元与基地址之间的字节距离
逻辑地址转换为物理地址


  BIU转换

  段基值左移4位与16位偏移量相加

逻辑地址的来源


  取地址 CS IP

  堆栈操作 SS SP

  取源串 DS(CS SS ES) SI

  存目的串 ES DI

  以BP作为基址 SS(CS DS ES) EA

  存取一般变量 DS(CS SS ES) EA

  ()内为允许代替来源也叫作段超越

堆栈操作及其操作方法


  堆栈的用途:暂存数据以及在过程中调用或处理中断时保存断点信息

堆栈的构造


  分为专用堆栈存储器软件堆栈

  堆栈固定的一段叫做栈底,是最大地址单元

  浮动一段叫做栈顶

  SP使用指向栈顶单元

  堆栈存取数据规则是 先进后出FILO

8086/8088堆栈的组织


  SP中的内容始终表示基址与栈顶之间的距离 SP=0表示全满

  SP初始化指向栈底+2单元,值是堆栈的长度

  以为单位存放,低8位存放较低地址单元,反之亦然。

  一个堆栈段长度超过64KB,可以设置多个

  改变SS可以改变到另一个堆栈段,改变后应立刻给SP赋新值

堆栈操作

  • 设置堆栈

      对SS和SP赋值
  • 进栈PUSH

      SP <= (SP)-2 (SP) <=数据
  • 出栈POP

      寄存器/存储器<=((SP)) SP<=(SP)+2

第三章 寻址方式与指令系统

寻址方式


  一条指令由两大部分组成 操作码+操作数

  • 操作码:指令应完成的具体操作。汇编使用一定的符号来表示,称为助记符。ADD PUSH POP MOV。
  • 操作数:该指令的操作对象。
  • 寻址方式:寻找指令中所需操作数的各种方法。有以下四种

      立即数操作数(操作数在指令代码中)

      寄存器操作数(操作数在CPU通用寄存器中或段寄存器中)

      存储器操作数(操作数在内存中)

      I/O端口操作数(操作数在I/O接口的寄存器中)
  • 立即数寻址
    MOV AH, 20H
    MOV AX, 20A0H

      立即数直接在指令队列取出,速度快。

      立即数不能作为目的操作数。
  • 寄存器寻址
    MOV AX, BX
    MOV DS, AX

      寄存器可以是通用寄存器或者段寄存器。

      在CPU内部进行,不需要总线周期。
  • 存储单元逻辑地址表示形式:段基值:偏移量(有效地址EA)

      有效地址EA是以下三个地址分量的几种组合。由EU计算出来。

       偏移量(指令中8位或16位数)

       基址(基址寄存器BX或基址指针BP提供)

       变址(源变址寄存器SI或目的变址寄存器DI提供)

      若有两个或以上分量,以2**16为模进行十六位加法运算
  • 直接寻址

      操作数的有效地址EA只有位移量地址分量
    # 用符号表示
    MOV BX, VAR;# 即 MOV BX, DS:VAR;
    MOV AL, DATA+2;# 即 MOV AL, DS:DATA+2
    # 用常数表示
    MOV AX, DS: [64H] # 必须加上 DS:
  • 寄存器间接寻址

      EA直接从基址寄存器(BX或BP)或变址寄存器(SI或DI)中获得

      事先将偏移量存放在寄存器中

      所在段寄存器可以省略,如果是BP寄存器隐含SS段寄存器,其他隐含DS段寄存器
    MOV AX, [BX] # MOV AX, DS: [BX]
    MOV BH, [BP] # MOV BH, SS: [BP]
    MOV [DI], BX # MOV DS: [DI], BX
  • 基址寻址/变址寻址

      操作数的有效地址EA等于基址分量/变址分量+指令给出的位移量

      操作码:寻址特征:位移量

      段寄存器隐含使用规则与寄存器间接寻址方式相同。
    MOV AX, 10H[IS]
    MOV TABLE [DI], AL

      可以很方便访问数组表格数据
  • 基址变址寻址

      EA = 基址 + 变址 + 位移量

      当基址选用BX是用DS寄存器,选用BP时使用SS寄存器
    MOV CX, 100H[BX][DI]
    MOV TABLE[BX][DI], AX

      可以方便地对二维数组进行访问
  • 串操作寻址方式

      寻找源操作数时,隐含使用SI作为地址指针。

      寻找目的串是,隐含使用DI作为地址指针。

      串操作完成后,自动对SI和DI进行修改,指向下一个操作数
  • I/O端口寻址

      编址方法如下:

        存储器编址方法:将I/O端口视为存储器的一个单元。

        I/O端口编址方法:I/O端口地址和存储器地址分开,有专门的输入输出指令
    # 直接端口寻址
    # 指令中直接给出端口地址,端口地址一般为两个16进制数
    IN AL, 25H
    # 寄存器间接端口寻址
    # 把I/O端口地址送到DX中(端口地址大于255只能用间接方式)
    MOV DX, 378H
    OUT DX, AL

指令系统


  一种计算机所能执行的各种类型的指令的集合称为该计算机的指令系统。

  指令系统的指令可以分为六大类

    传送类指令

    算数运算类指令

    位操作类指令

    串操作类指令

    程序转移类指令

    处理器控制类指令

  指令的格式划分可以分为三类:双操作数指令 单操作数指令 无操作数指令

  无操作数指令包含一下两种指令:

    不需要操作数 暂停指令HLT

    没有显式指明操作数 指令PUSHF

传送类指令
  • 通用数据传送指令

      指令格式 MOV DEST, SRC

      DEST<=(SRC)

      MOV指令对标志寄存器的各位无影响

      MOV指令可以分为以下几种情况
    # 1.立即数传送到通用寄存器或存储单元
    MOV AH, 10H
    MOV AX, 2345H
    MOV M-BYTE, 64H
    MOV M-WORD, 2364H
    # 立即数只能作为源操作数,不能传送给段寄存器
    # 2.寄存器之间的传送
    MOV AH, CH
    MOV DS, AX
    MOV ES, BX
    MOV CS, AX #错误
    # 段寄存器CS只能作为源操作数
    # 3.寄存器与存储单元之间的传送
    MOV AL, [SI]
    MOV [DI], AH
    MOV AX, 10[BX]
    MOV TABLE[BP], BX
    MOV DS, [SI][BX]
    MOV [BX], [BP][SI] #错误
  • 交换指令

      指令格式 XCHG DEST, SRC

      DEST<=>(SRC)

      奇偶啊换指令可以在寄存器之间或寄存器与存储单元之间进行(存储器只能使用通用寄存器)
    XCHG AX, BX
    XCHG AH, CH
    # DA_BYTE1和DA_BYTE2之间数据交换
    MOV AL, DA-BYTE1
    XCHG AL, DA-BYTE2
    XCHG AL, DA-BYTE1 #或MOV DA-BYTE1 AL
  • 标志传送指令

      有四条,均为无操作数指令

      ·取标志寄存器指令

      指令格式LAHF

      将标志寄存器的低八位送入AH寄存器

      7: 符号位 6:零值位 4:辅助进位位 2:奇偶位 0:进位位

      ·存储标志寄存器指令

      指令格式SAHF(与LAHF相反)

      ·标志进栈指令

      指令格式PUSHF

      将堆栈指针SP-2,然后将FLAG的内容送入SP指向的字单元

      ·标志出栈指令

      指令格式POPF(与PUSHF相反)
  • 地址传送指令

      ·装入有效地址

      指令格式 LEA DEST, SRC

      SRC必须是一个字节存储器操作数(地址),DEST必须是一个16位通用寄存器

      作用:将SRC存储单元地址中的偏移量(SA),传送到一个16位通用寄存器中。
    LEA AX, [BX][SI] # AX <=(BX)+(SI) 传送的是地址,不是存储单元的内容

      ·装入地址指针指令

      指令格式:LDS DEST, SRC // LES DEST, SRC

      DEST 是 任意一个16位通用寄存器,SRC必须是寄存器操作数

      作用:把SRC存储单元开始的4个字节单元的内容(32位地址指针)送入DEST通用寄存器段寄存器DS(LDS指令)或ES(LES指令),其中低字单元内容为偏移量送通用寄存器,高字单元内容为段基值DS或ES
    LDS SI, TABLE[BX]
    # 如果TABLE为0A02H, BX=34H DS=2030H
    # 执行结束有 DS = 5030(20D36H和20D38H存储信息) SI = 0020(20D3AH和20D3CH存储信息)
算数运算类指令
  • 加法指令

      指令格式:ADD DEST, SRC

      DEST <= (DEST) + (SRC)

      结果影响寄存器CF PF AF ZF SF OF

      DEST和SRC都不能为存储器操作数

      ADD可以是字节操作数相加,也可以是字操作数相加
    ADD AX, CX
    ADD AH, DATA_BYTE #直接寻址方式所指示的存储单元+AH = AH
    ADD CX, 10H
    ADD AX, [BX][SI] #基址变址寻址方式所指示的存储单元的内容加入到AX中。
  • 带进位加法指令

      指令格式 ADC DEST, SRC

      DEST <= (DEST) + (SRC) + CF
    # 例 计算12349678H + 377425H
    MOV AX, 1234H
    MOV BX, 9678H
    ADD BX, 7425H
    ADC AX, 37H
  • 加1指令

      指令格式 INC DEST

      DEST <= (DEST)+1

      不影响CF
    INC CL
    INC SI
    INC COUNT
  • 减法指令

      指令格式:SUB DEST, SRC

      DEST <= DEST - SRC

      两者不能同时为存储器操作数
    SUB AX, BX
    SUB AH, 10H
    SUB AX, DA-WORD
    SUB DA-BYTE, BL
  • 带借位减法

      指令格式:SBB DEST, SRC

      DEST <= DEST - SRC - CF
  • 减1指令

      DEC DEST

      DEST <= DEST - 1

      不影响CF
  • 求负数指令

      指令格式: NEG DEST

      DEST = 0 - (DEST)

      当操作数为0,CF为0,其他为1

      当字节操作数为-128或字操作数为-32768时,操作数没有变化,但是溢出标志位OF为1
    # 求AL和BL的相反数
    NEG AL
    NEG BL
位操作类指令
  • 逻辑运算指令

      与指令 AND DEST,SRC

      或指令 OR DEST,SRC

      异或指令 XOR DEST,SRC

      非指令 NOT DEST

      DEST和SRC不能同时为存储器操作数

      NOT对标志位没有影响,其他CF OF总是0,AF不确定
  • 测试指令

      TEST DEST, SRC

      逻辑与运算,但是运算结果不送入DEST中
  • 移位/循环移位指令

      ·算术位移

      算术左移 SAL DEST, COUNT

      算术右移 SAR DEST, COUNT

      ·逻辑位移

      逻辑左移 SHL DEST, COUNT

      逻辑右移 SHR DEST, COUNT

      ·循环位移

      循环左移 ROL DEST, COUNT

      循环右移 ROR DEST, COUNT

      ·大循环

      带进位循环左移 RCL DEST, COUNT

      带进位循环右移 RCR DEST, COUNT

      当循环次数为1,使用常数1或寄存器CL

      当循环次数大于1,使用寄存器CL
    SAL AX, 1
    MOV CL, 2
    SAR AX, CL
    MOV AL, 10010011B
    SHL AL,1 # CF标志为1
    SAR AL,1 # CF标志为0

      移位次数为1是,一位前后操作数的符号位发生变化,OF为1,否则为0.多次OF不确定

      SAL或SAR移位n此,相当于乘或除以2**n,叫做算术移位指令
处理器控制类指令
  • 标志位操作指令

      都是无操作数指令,能直接操作的有CF、IF和OF。

      清除进位标志 CLC CF = 0

      置1进位标志 STC CF = 1

      进位标志取反 CMC CF = -CF

      清除方向标志 CLD DF = 0

      置1方向标志 STD DF = 1

      清除中断标志 CLI IF = 0

      置1中断标志 STI IF = 1
  • 与外部事件同步的指令

      HLT 暂停指令

      WAIT 等待指令

      ESC 外部协处理器指令前缀

      LOCK 总线锁定指令
  • 空指令操作 NOP

      用于延时 三个CPU时钟周期

指令编码

双操作数指令编码格式


  例如MOV ADD AND,操作数是以下两种情况

  ·一个操作数在寄存器中,一个在寄存器或存储器中。

  ·目的操作数在寄存器或存储器中,源操作数是立即数。

  目标代码长度是2~6个字节

  指令编码有4个部分

  • 操作特征部分

      ·OPCODE:操作码字段

      6bit,表示了该指令执行的功能和两个错啊作数的来源

      ·方向字段d

      与寻址特征一起来决定源操作数和目的操作数的来源

      如果位立即数Imm,d字段无效,并入操作码字段

      ·字/字节字段W

      W=1 字 W=0 字节
  • 寻址特征部分

      与d结合,制定使用什么寻址方式,使用哪个寄存器。

      包括MOD REG和R/M三个字段 REG决定一个操作数,其他两个决定另一个操作数

      ·REG字段确定的一个操作数是某一通用寄存器的内容,即寄存器寻址方式。

      可以分别制定16个寄存器之一,或者四个段寄存器

      ·寻址方式字段MOD和寄存器/存储器字段R/M

      MOD、R/M和W字段共同确定操作数的寻址方式和所使用的寄存器
  • 位移量部分

      有以下三种情况,没有位移量,有1字节位移量,有两字节位移量。
  • 立即数部分
单操作数指令编码格式


  操作特征部分:包括OPCODE V W三个字段。

  V只有移位/循环指令才有

与AX和AL有关的指令编码格式


  除一个操作数是AX/AL外,另一个可以是立即数或者存储单元

其他指令编码格式

汇编语言程序格式

汇编语言语句种类及其格式

指令语句


  一般格式为

  标号 : 指令助记符 操作数 ; 注释

  • 标号字段 可选字段,代表了第一个字节存放的地址。

      放在入口处,控制程勋执行转到该程序位置。

      转移指令或子程序调用指令中,可以直接引用标号。
  • 指令助记符字段 必选项 如MOV ADD

      可以加上前缀
  • 操作数字段

      可以有一个操作数,两个或没有
  • 注释字段

  •   该字段以;开始
伪指令语句


  又叫做命令语句

  符号名 伪指令符 操作数 ; 注释

  • 符号名字段

      可选项,可以是常量名 变量名 过程名 结构名 记录名
  • 伪指令字段

      必选项,规定了汇编程序所要完成的具体操作
  • 操作数字段

      是否必要由伪指令字段决定。操作数可以是常数 字符串 常量名 变量名 符号 和一些专用符号
  • 注释字段

      同上
标识符


  指令语句中的标号和伪指令语句中的符号名统称为标识符。

  组成规则:

  1. 字数1-31个
  2. 第一个必须是字母 问号 @ 下划线之一
  3. 第二个开始可以是 字母 数字 @ 下划线 问号
  4. 不能使用保留字

汇编语言数据


  数据是指令和伪指令语句操作数的基本组成部分。由数值和属性两个部分组成。

  常见的数据类型有常数 变量和标号

常数


  常数几种形式:

  • 二进制数 B结尾
  • 八进制数 O或Q结尾
  • 十进制数 D结尾或省略
  • 十六机制数 H结尾
  • 实数 ±整数部分.小数部分E ±指数部分 2.134E+10
  • 字符串常量 用引号引起来的一个或多个字符,以ASCII码存储在内存。

      常数可以用于以下几种情况:
  • 作为源操作数
  • 在之领域具的直接寻址方式、变址寻址方式和基址变址寻址方式中作为位移量
  • 在数据定义伪指令中使用
变量


  变量用来表示存放数据的存储单元

  可以认为变量名就是存放数据的存储单元地址

  • 变量的定义与预置

      定义变量就是给这个变量在内存中分配一定的存储单元,并赋予一个符号名。

      定义变量使用数据定义伪指令DB DW DD DQ DT

      一般格式 变量名 DB 表达式1,表达式2......

      被定义以后有以下三个属性

       段属性 表示变量存放在哪一个逻辑段

       偏移量属性 表示变量所在位置与段起始点的字节数

       类型属性

      赋初值可以使用以下四种形式

       数值表达式 DATA1 DB 32, 30H

       ?表达式 可以预置任何位置 DA-BYTE DB ?,?,?

       字符串表达式 STRING1 DB 'ABCDEF'(两个字符存放顺序是前一个字符在高地址,后一个字符放在低地址)

       DUP表达式 DUP成为重复数据操作符 DATA_A DB 10H DUP(?); 重复字符?满16个字节
  • 变量的使用

      在指令语句中引用

      在伪指令语句中引用
标号


  标号是指令地址的别名

  标号有三个属性 段属性 偏移量属性 距离属性(类型属性)

  NEAR(近) 段内转移

  FAR(远) 可以被非本段转移和调用

  确定有两种方法

   隐含方式 SUB1默认NEAR

   LABEL+类型 SUB1_FAR LABEL FAR

  LABEL伪指令还可以定义变量的属性

符号定义语句
  • 等值语句

      语句格式: 符号名 EQU 表达式

      表达式可以是任意的形式
  1. 常数或数值表达式

      COUNT EQU 5

      NUM EQU COUNT+5
  2. 地址表达式

      ADR1 EQU DS:[BP+14]
  3. 变量、寄存器名或指令助记符

      CREG EQU CX

      同一符号不能被EQU定义多次
  • 等号语句

      符号名=表达式

      可以进行多次定义

      等号语句不能为助记符定义别名

      不会分配存储单元,没有段、位移量和类型等属性。
表达式与运算符


  任何表达式的值在程序被汇编的过程中进行确定,而不是到程序运行时才计算

  • 算数运算符 + - * / MOD SHL SHR []

      []具有相加的作用
  • 逻辑运算符

       NOT AND OR XOR
  • 关系运算符

       EQ NE LT LE GT GE(python中__eq__等相同)
  • 数值返回运算符

      SEG运算符:取变量或标号所在段的段基值

      PFFSET运算符:取变量或标号在段内的偏移量

      TYPE运算符:取变量或标号类型属性,并用数字形式表示

      LENGTH运算符:取变量的长度

      SIZE运算符:等于LENGTH和TYPE返回值的乘积
  • 属性修改运算符

      PTR运算符 类型 PTR 地址表达式;将地址表达式所指定的类型属性修改为类型所值得值

      HIGH/LOW运算符 常量分离成高8位和低8位 地址分离出高字节和低字节

      THIS运算符 与等值运算符EQU运算,定义一个变量或标号的类型属性。所定义的变量或标号的段基值和偏移量与紧随其后的变量或标号相同。
  • 运算符的优先级
  1. LENGTH SIZE 圆括号
  2. PTR OFFSET SEG TYPE THIS
  3. HIGH LOW
    • / MOD SHR SHL
  4. EQ NE LT LE GT GE
  5. NOT
  6. AND
  7. OR XOR


  可以用圆括号改变运算顺序

程序的段结构
  • 段定义伪指令

      一般格式
    段名 SEGMENT [定位类型][组合类型]['类别名']
    ...
    ...
    ...
    段名 ENDS

      段名:用户自己任意选定,符合标识符定义规则的一个名称。

      定位类型:决定段的起始边界

       PAGE从一个页面的边界开始

       PARA从一个小节的边界开始(缺省)

       WORD从一个偶数字节地址开始

       BYTE任一地址

      组合类型:段与段之间的连接关系和定位
  1. 未指定组合类型 与其他段没有连接关系
  2. PUBLIC 与段同名的邻接在一起
  3. COMMON 产生一个覆盖段 与COMMON说明的同名段置成相同的段基值
  4. STACK 把所有同名段连接成一个连续段
  5. AT表达式 可定位在表达式所指示的小节边界上
  6. MEMORY 应定位在所有其它段之后的最高地址上

      类别名

      必须用单引号引起来
段寻址伪指令


  段寻址伪指令ASSUME的作用是告诉汇编程序,在处理源程序时,定义的段和哪个寄存器关联

  一般格式 ASSUME 段寄存器名: 段名,段寄存器名:段名,......

  可以使用NOTHING将前面的设置删除

段寄存器的装入
  • DS和ES的装入

      使用数据传送语句MOV
  • SS的装入

      使用STACK参数,并在ASSUME语句中把这段与SS段寄存器关联。

      可以类似DS和ES
  • CS的装入

      不能用可执行语句来装入

      由系统软件按照结束伪指令制定的地址装入初始的CS和IP

      END 起始地址

      在程序执行期间,当执行某些指令是,CPU自动修改CS和IP,使他们指向新的代码段
过程定义伪指令(PROC/ENDP)


  格式如下:
过程名 PROC [NEAR/FAR]
...
RET
...
过程名 ENDP

当前位置计数器$与定位伪指针ORG


  位置计数器$使用上完全类似变量的使用

  定位伪指针ORG 用来改变位置计数器的值

  ORG 数值表达式

标题伪指令TITLE


  TITLE 标题名

从程序返回操作系统的方法
  • 使用程序段前缀PSP实现返回
  • 使用DOS系统功能调用实现返回

      执行DOS功能调用4CH,也可以控制用户程序结束,返回DOS操作系统。

      在程序结束时,使用两条指令:
    MOV AH,4CH
    INT 21H
posted @ 2022-03-13 21:10  20192414袁浩然  阅读(264)  评论(0编辑  收藏  举报