SCAU 汇编语言 期末复习 (上)

本文详细讲解了计算机存储单位及其转换,重点介绍了DEBUG工具的各个命令,包括DUMP、R、A、G、T、U和Q,以及汇编、运行、跟踪和反汇编等关键概念。此外,涵盖了寄存器、标志位、数据传送指令、算术指令和控制转移指令的基础知识。
摘要由CSDN通过智能技术生成

第一章

1.储存单位
存储容量:bit 、Byte、 Word
1 kilobytes=210bytes=1024bytes
1megabyte(MB)=220bytes
1gigabyte(GB)=230bytes
1terabyte(TB)=240bytes
1petabyte=250bytes
1exabyte=260bytes
1zettabyte=270bytes
1yottabyte=280bytes
2个字节: Word (字)
1Word = 2Byte = 16bit

2.重要ASCII码
‘A’ 41H
‘a’ 61H
‘1’ 31H
换行 0AH
回车 0DH
空格 20H

第二章

DEBUG的主要命令
1、显示存储单元的命令D(DUMP)
格式为:
_D[address]或_D[range]

D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。

2、检查和修改寄存器内容的命令R(register)
显示CPU内所有寄存器内容和标志位状态,其格式为:
-R
显示和修改某个寄存器内容,其格式为:
-R register name
显示和修改标志位状态,命令格式为:
-RF
不修改其内容可按ENTER键
可键入欲修改的内容键入的顺序可以是任意的。

3、汇编命令A(Assemble)
格式为:
-A[address]
该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D。

4、运行命令G,
格式为:
-G[=address1][address2[address3…]]
其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。

5、跟踪命令T(Trace),有两种格式:
·(1)逐条指令跟踪
-T [=address]
从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的CS:IP开始执行。
·(2)多条指令跟踪
-T [=address][value]
从指定地址起执行n条指令后停下来,n由value指定。

6、反汇编命令U(Unassemble)
(1)从指定地址开始,反汇编32个字节,其格式为:
-U[address]
如果地址被省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。
(2)对指定范围内的存储单元进行反汇编,格式为:
-U[range]

7、退出DEBUG命令Q(Quit),其格式为:
-Q
它退出DEBUG,返回DOS。

寄存器
在这里插入图片描述
标志寄存器FLAGS register
在这里插入图片描述
进位标志CF(Carry Flag)
当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。
例如:
3AH + 7CH=B6H,没有进位:CF = 0
AAH + 7CH=(1)26H,有进位:CF = 1

零标志ZF(Zero Flag)
若运算结果为0,则ZF = 1,否则ZF = 0。
例如:
3AH + 7CH=B6H,结果不是零:ZF = 0
86H + 7CH=(1)00H,结果是零:ZF = 1
注意:ZF为1表示的结果是0

符号标志SF(Sign Flag)
运算结果最高位为1,则SF = 1;否则SF = 0。
例如:
3AH + 7CH=B6H,最高位D7=1:SF = 1
86H + 7CH=(1)00H,最高位D7=0:SF = 0
有符号数据利用最高有效位表示数据的符号。所以,最高有效位就是符号标志的状态。

奇偶标志PF(Parity Flag)
当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0。
例如:
3AH + 7CH=B6H=10110110B,
结果中有5个1,是奇数:PF = 0
注意:PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作。

溢出标志OF(Overflow Flag)
若算术运算的结果有溢出,则OF=1;否则 OF=0。例如:
3AH + 7CH=B6H,产生溢出:OF = 1
AAH + 7CH=(1)26H,没有溢出:OF = 0

辅助进位标志AF(Auxiliary Carry Flag)
运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。
例如:
3AH + 7CH=B6H,D3有进位:AF = 1
这个标志主要由处理器内部使用,用于十进制算术运算指令中,用户一般不必关心。

**存储器以字节(8bit)**为单位存储信息
字及以上单位
存储遵循高高低低的原则
以最低字节的地址作为地址
在这里插入图片描述
实模式(Real Mode)
1MB的地址需要20-bit数字
16*selector + offset
E.g. 047C: 0048
047C0
+0048
------------------------
04808
缺点:
一个段最大64K
每个内存单元的段地址可以不同
E.g., The physical address 04808 can be referenced by 047C:0048, 047D:0038, 047E:0028 or 047B:0058.

小段:每16个字节为一小段,共有64K个小段

          小段的首地址
              00000H ~ 0000FH
              00010H ~ 0001FH
              00020H ~ 0002FH
              …
              FFFF0H ~ FFFFFH 

存储器分段:段起始地址必须是某一小段的首地址,
段的大小可以是64K范围内的任意字节。
物理地址:每个存储单元的唯一的20位地址
段地址:段起始地址的高16位
偏移地址:段内相对于段起始地址的偏移值(16位)
(有效地址EA)
物理地址 = 16d × 段地址 + 偏移地址

第三章

在这里插入图片描述
(1) 立即寻址方式* —— 操作数在指令中给出
指令格式: MOV AL, 5
MOV AX, 3064H
MOV AL, ‘A’

  • 只能用于 SRC 字段 MOV 40H, AL ×
  • SRC 和 DST 的字长一致
    MOV AH, 3064H ×

(2) 寄存器寻址方式* — 操作数在指定的寄存器中
MOV AX, BX
MOV AL, BH
MOV AX, 3064H

  • 字节寄存器只有 AH AL BH BL CH CL DH DL
  • SRC 和 DST 的字长一致 MOV AH, BX ×
  • CS 不能用 MOV 指令改变 MOV CS, AX ×

(3) 直接寻址方式* — 有效地址EA由指令直接给出
例:MOV AX, [ 2000H ]
EA=2000H, 假设(DS)=3000H, 那么PA=32000H
* 隐含的段为数据段 DS

  • 可使用段跨越前缀 MOV AX, ES: [2000H]
  • 操作数地址可由变量(符号地址)表示, 但要注意
    VALUE DB 10 变量的属性
    MOV AH, VALUE
    MOV AX, VALUE ×
    MOV AX, WORD PTR VALUE √

寄存器间接寻址* — EA 在基址寄存器(BX/BP)
或变址寄存器(SI/DI) 中
MOV AX, [BX] PA = 16d × (DS) + (BX)
MOV AX, ES:[BX] PA = 16d × (ES) + (BX)
MOV AX, [BP] PA = 16d × (SS) + (BP)

  • 不允许使用AX、CX、DX 存放 EA
    MOV AX, [CX] ×
  • SRC 和 DST 的字长一致
    MOV DL, [ BX ] ; [BX]指示一个字节单元
    MOV DX, [ BX ] ; [BX]指示一个字单元
  • 适于数组、字符串、表格的处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据传送指令:
• 通用数据传送指令
MOV、PUSH、POP、XCHG
• 累加器专用传送指令
IN、OUT、XLAT
• 地址传送指令
LEA、LDS、LES
• 标志寄存器传送指令
LAHF、SAHF、PUSHF、POPF
• 类型转换指令
CBW、CWD

MOV
• 通用数据传送指令MOV(move)
传送指令: MOV DST, SRC
执行操作: (DST) ← (SRC)

注意:

  • DST、SRC 不能同时为段寄存器 MOV DS, ES ×
  • 立即数不能直接送段寄存器 MOV DS, 2000H ×
  • DST 不能是立即数和CS
  • DST、SRC 不能同时为存储器寻址
  • 不影响标志位

Int 21h
功能号-〉AH
设置调用参数
INT 21H

循环结构
MOV CX,3
MOV BX,0
LOP1: ADD BX,1
LOOP LOP1

带(/无)符号扩展传送指令MOVSX /MOVZX
指令格式: MOVSX/MOVZX DST, SRC
执行操作: (DST) ← (SRC)有/无符号扩展

注意:
DST:register,16位或32位
SRC:register/memory,8位或16位
不影响标志位

进栈PUSH(push onto the stack)指令
PUSH SRC
执行操作: (SP) ← (SP) – 2
( (SP)+1, (SP) ) ← (SRC)

出栈POP(Pop from the stack)指令
POP DST
执行操作: (DST) ← ( (SP)+1, (SP) )
(SP) ← (SP) + 2

堆栈:‘先进后出’的存储区,段地址存放在SS中,
SP在任何时候都指向栈顶,进出栈后自动修改SP。

注意: * 堆栈操作必须以字或双字为单位。
* 不影响标志位
* 16位不能用立即寻址方式,但32位的允许
PUSH 1234H ×
* DST不能是CS POP CS ×

交换XCHG(exchange)指令
XCHG OPR1, OPR2
执行操作: (OPR1) ↔ (OPR2)

注意: * 在寄存器和存储器之间交换
* 起码有一个操作数是寄存器操作数
* 不影响标志位
* 不允许使用段寄存器

 例:XCHG  BX, [ BP+SI ]
         XCHG  AL, BH

累加器专用传送指令P53(只限使用AX或AL)

 输入input指令    IN   (I/O → CPU)
      
 长格式:     IN   AL, PORT   (字节)
                      IN   AX, PORT   (字)
 执行操作:(AL)  ←  ( PORT )                  (字节)
                     (AX)  ←  ( PORT+1,  PORT )(字)

  短格式:    IN   AL, DX   (字节)
                      IN   AX, DX   (字)
  执行操作:(AL)  ←  ( (DX) )               (字节)
                      (AX)  ←  ( (DX)+1,  (DX) )(字)     

输出output指令 OUT (CPU → I/O)
长格式: OUT PORT, AL (字节)
OUT PORT, AX (字)
执行操作:( PORT ) ← (AL) (字节)
( PORT+1, PORT ) ← (AX)(字)

短格式: OUT DX, AL (字节)
OUT DX, AX (字)
执行操作:( (DX) ) ← (AL) (字节)
( (DX)+1, (DX) ) ← (AX)(字)

注意:

  • 不影响标志位
  • 前256个端口号00H~FFH可直接在指令中指定(长格式)
  • 如果端口号≥ 256,端口号 → DX(短格式)

XLAT(换码指令)
实现的功能: 实现编码的快速转换
实现的机理: 初始化条件是 在数据段建立一个转换表table, 将该表的首地址加载给BX, 在AL中加载要转换的编码,跟据对应关系,将AL中的编码适当转化以使其与表格中的换码对应,然后执行指令 XLAT table,其中table是可选,只为可读性考虑。
(AL)<-------( [(BX) +(AL) ] ) = ( table[AL] )

例:MOV BX, OFFSET TABLE ; (BX)=0040H
MOV AL, 3
XLAT TABLE
指令执行后 (AL)=33H
在这里插入图片描述

注意:

  • 不影响标志位
  • 字节表格(长度不超过256)
    首地址 → (BX)
  • 需转换的代码位移量 → (AL)

地址传送指令

 load effective address有效地址送寄存器指令:    		LEA  REG, SRC
 执行操作: (REG) ← SRC
 
 load DS with pointer指针送寄存器和DS指令:   		LDS  REG, SRC
 执行操作:    (REG) ←  (SRC)
                          (DS)    ←  (SRC+2)
     相继二字 → 寄存器、DS
  
  指针送寄存器和ES指令:  LES  REG, SRC
  执行操作:                           (REG)  ←  (SRC)
                                                 (ES)      ←  (SRC+2)
     相继二字 → 寄存器、ES  

注意:
* 不影响标志位
* REG 不能是段寄存器
  * SRC 必须为存储器寻址方式

算术指令:
• 加法指令
ADD、ADC、INC
• 减法指令
SUB、SBB、DEC、NEG、CMP
• 乘法指令
MUL、IMUL
• 除法指令
DIV、IDIV
• 十进制调整指令
DAA、DAS、
AAA、AAS、AAM、AAD

加法指令

 add加法指令:    ADD  DST, SRC  
 执行操作:    (DST)  ←  (SRC) + (DST)

 add with carry带进位加法指令:  ADC  DST, SRC  
 执行操作:    (DST)  ←  (SRC) + (DST) + CF

 increment加1指令:        INC  OPR  
 执行操作:      (OPR)  ←  (OPR) + 1

除INC指令不影响CF标志外,均对条件标志位有影响。

在这里插入图片描述
减法指令

subtract减法指令: SUB DST, SRC
执行操作: (DST) ← (DST) - (SRC)

Subtract with borrow带借位减法指令: SBB DST, SRC
执行操作: (DST) ← (DST) - (SRC) - CF

decrement减1指令: DEC OPR
执行操作: (OPR) ← (OPR) - 1

negate求补指令: NEG OPR
执行操作: (OPR) ← - (OPR)

compare比较指令: CMP OPR1, OPR2
执行操作: (OPR1) - (OPR2)
在这里插入图片描述
乘法指令

unsigned multiple无符号数乘法指令: MUL SRC
signed multiple带符号数乘法指令: IMUL SRC

 执行操作:
                   字节操作数  (AX) ←  (AL) * (SRC)
                   字操作数      (DX, AX) ←  (AX) * (SRC)

注意:

  • AL (AX) 为隐含的乘数寄存器。
  • AX (DX,AX) 为隐含的乘积寄存器。
  • SRC不能为立即数。
  • 除CF和OF外,对条件标志位无定义。

• 除法指令

 unsigned divide无符号数除法指令:   DIV  SRC
 signed divide带符号数除法指令:   IDIV  SRC
 执行操作: 
                字节操作  (AL) ← (AX) / (SRC) 的商
                                  (AH) ← (AX) / (SRC) 的余数

                字操作      (AX) ← (DX, AX) / (SRC) 的商
                                  (DX) ← (DX, AX) / (SRC) 的余数

注意: * AX (DX,AX) 为隐含的被除数寄存器。
* AL (AX) 为隐含的商寄存器。
* AH (DX) 为隐含的余数寄存器。
* SRC不能为立即数。
* 对所有条件标志位均无定义。如何判别结果有效?

逻辑指令:

  •   逻辑运算指令
     AND、OR、NOT、XOR、TEST 
  •   移位指令
     SHL、SHR 、 SAL 、SAR、
      ROL、ROR、RCL、RCR

• 逻辑运算指令
逻辑非指令:NOT OPR * OPR不能为立即数
执行操作: (OPR) ← ¬ (OPR) * 不影响标志位

逻辑与指令:AND DST, SRC
执行操作: (DST) ← (DST) ∧ (SRC)

逻辑或指令:OR DST, SRC
执行操作: (DST) ← (DST) ∨ (SRC)

Exclusive or异或指令: XOR DST, SRC
执行操作: (DST) ← (DST) ∀ (SRC)

测试指令: TEST OPR1, OPR2
执行操作: (OPR1) ∧ (OPR2)

• 移位指令
Shift logical left逻辑左移 SHL OPR, CNT
Shift logical right逻辑右移 SHR OPR, CNT
Shift arithmetic left算术左移 SAL OPR, CNT(同逻辑左移)
Shift arithmetic right算术右移 SAR OPR, CNT
Rotate left循环左移 ROL OPR, CNT
Rotate right循环右移 ROR OPR, CNT
Rotate left through carry带进位循环左移 RCL OPR, CNT
Rotate right through carry带进位循环右移 RCR OPR, CNT

双精度移位(386)
SHLD DST,REG,CNT
把REG放在DST的右边共同作为一个整体向左移位,移位的次数可以为1-31;最后的结果放在DST中,REG的值不变;
SHRD DST,REG,CNT
把REG放在DST的左边共同作为一个整体向左移位,移位的次数可以为1-31;最后的结果放在DST中, REG的值不变。

控制转移指令:
• 无条件转移指令
JMP
• 条件转移指令
JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、
JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、
JLE / JNLE、 JCXZ
• 循环指令
LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE
• 子程序调用和返回指令
CALL、RET
• 中断与中断返回指令
INT、INTO、IRET

段内寻址
段内直接寻址 JMP NEAR PTR NEXT
段内间接寻址 JMP TABLE [ BX ]

段间寻址
段间直接寻址 JMP FAR PTR NEXT
段间间接寻址 JMP DWORD PTR [ BX ]

条件转移指令:
注意:只能使用段内直接寻址的8 位位移量

(1) 根据单个条件标志的设置情况转移  
格式 测试条件
JZ(JE) OPR ZF = 1
JNZ(JNE) OPR ZF = 0
JS OPR SF = 1
JNS OPR SF = 0
JO OPR OF = 1
JNO OPR OF = 0
JP OPR PF = 1
JNP OPR PF = 0
JC OPR CF = 1
JNC OPR CF = 0

(2) 比较两个无符号数,并根据比较结果转移*

                       格式           测试条件

<         JB (JNAE,JC)     OPR             CF = 1
≥         JNB (JAE,JNC)  OPR             CF = 0
≤    JBE (JNA)            OPR             CF∨ZF = 1
>         JNBE (JA)           OPR             CF∨ZF = 0
  • 适用于地址或双精度数低位字的比较

(3) 比较两个带符号数,并根据比较结果转移*

                  格式           测试条件

  <         JL (JNGE)   OPR           SF∀OF = 1
  ≥    JNL (JGE)   OPR           SF∀OF = 0
  ≤    JLE (JNG)     OPR         (SF∀OF)∨ZF = 1
  >        JNLE (JG)    OPR          (SF∀OF)∨ZF = 0
  • 适用于带符号数的比较

(4) 测试 CX 的值为 0 则转移

                  格式            测试条件         
           JCXZ     OPR                      (CX)=0

CALL 调用指令
段内直接近调用:CALL DST
执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP)
(IP) ← (IP) + 16位位移量

段内间接近调用:CALL DST
执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP)
(IP) ← (EA)

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值