【汇编语言课程】 知识点+易错题 吐血整理(上)

【汇编语言课程】 知识点+易错题 吐血整理(上)

一、基础知识

知识点整理:

  1. 汇编语言由汇编指令、伪指令和其他符号组成
  2. 汇编指令是机器指令的助记符,同机器指令一一对应
  3. 指令和数据没有任何区别,都是二进制信息
  4. 存储器的容量以字节Byte作为最小单位,8个bit组成一个Byte
  5. CPU想要进行数据的读写,必须和外部器件进行3类信息的交互,即存储单元的地址(地址信息)、器件的选择,读或写的命令(控制信息)、读或写的数据(数据信息
  6. 总线:连接CPU和其他芯片的导线,分为3类,即地址总线、控制总线和数据总线
  7. 地址总线:CPU通过地址总线来指定存储器单元,若一个CPU有N根地址线,则该CPU的地址总线的宽度为N,最多可以寻找2N个内存单元(即2N个字节)
  8. 数据总线:CPU与内存或其他器件之间的数据传送是通过数据总线进行的,8根数据总线一次可传送一个8位二进制数据(即一个字节)
  9. 控制总线:CPU对外部器件对控制是通过控制总线
  10. 8086CPU有16根数据总线(1次传送2B),20位地址总线(1MB寻址能力)

易错题:

  1. 1KB 的存储器可以存储 8192(2^13)个 bit,1024个 Byte。
  2. 8080、8088、80296、80386 的地址总线宽度分别为 16 根、20 根、24 根、32 根,则它们的寻址能力分别为:64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。
  3. 8080、8088、8086、80286、80386 的数据总线宽度分别为 8 根、8 根、16 根、16 根、 32 根。则它们一次可以传送的数据为: 1 (B)、 1 (B)、 2 (B)、 2 (B)、 4 (B)。
  4. 从内存中读取 1024 字节的数据,8086 至少要读 512 次,80386 至少要读 256 次。

二、寄存器

知识点整理:

  1. 寄存器是CPU中程序员可以用指令读写的部件,8086CPU的所有寄存器都是16位的
  2. 8086CPU有14个寄存器,即AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
  3. AX、BX、CX、DX这4 个寄存器通常用来存放一般性的数据,被称为通用寄存器
  4. AX可分为AH和AL;BX可分为BH和BL;CX可分为CH和CL; DX可分为DH和DL,即可分为两个可独立使用的8位寄存器来用
  5. 字节:记为byte, 一个字节由8个bit组成,可以存在8位寄存器中。字:记为word, 一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节
  6. 在写一条汇编指令或一个寄存器的名称时不区分大小写。
  7. 在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的
  8. 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址(8086CPU有20位地址总线,可以传送20位地址)。
  9. CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;地址加法器将两个16位地址合成为一个20位的物理地址;
  10. 地址加法器采用物理地址=段地址 x 16+偏移地址的方法用段地址和偏移地址合成物理地址。
  11. 段的起始地址一定是16的倍数;偏移地址 为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。
  12. CPU可以用不同的段地址和偏移地址形成同一个物理地址。
  13. 偏移地址16位,变化范围为0〜FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。
  14. 8086CPU有4个段寄存器:CS、DS、SS、ES
  15. CS和IP是8086CPU中两个最关键的寄存器,它们指示了 CPU当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器。若CS中的内容为M, IP中的内容为N, 8086CPU将从内存Mx16+N单元开始,读取一条指令并执行
  16. 注意执行完指令后IP=IP+所读指令的长度,例如:mov ax,0123H后IP+3;mov ax,bx后IP+2
  17. 注意指令在内存中的存取顺序,例如mov ax,0123H在内存中从上到下存储的为B8 23 01
  18. mov指令不能用于设置CS、IP的值,可使用jmp指令
  19. jmp段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址 修改IP
  20. jmp某一合法寄存器”指令的功能为:用寄存器中的值修改IP

易错题:

  1. 给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为 0010H 到 1000FH ((0001h x 16+0h)~ (0001h x 16+ffffh) )
  2. 有一数据存放在内存 20000H 单元中,现给定段地址为 SA,若想用偏移地址寻到此单元。 则 SA 应满足的条件是:最小为 1001H ,最大为 2000H 。 (SA=(20000h-EA)/16=2000h-EA/16 )
  3. 下面的 3 条指令执行后,cpu 几次修改 IP?都是在什么时候?最后 IP 中的值是多少? mov ax,bx ;sub ax,ax ;jmp ax ;
    答:一共修改四次;第一次:读取 mov ax,bx 之后 第二次:读取 sub ax,ax 之后 ;第三次:读取 jmp ax 之后 ;第四次:执行 jmp ax 修改 IP 最后 IP 的值为 0000H,因为最后 ax 中的值为 0000H,所以 IP 中的值也为 0000H

三、寄存器(内存访问)

知识点整理:

  1. 字单元:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。将起始地址为N的字单元简称为N地址字单元
  2. DS寄存器:用来存放要访问数据的段地址
  3. mov寄存器名,内存单元地址可将一个内存单元中的内容送入一个寄存器中,“[…]”表示一个内存单元;指令执行时,8086CPU自动取ds中的数据为内存单元的段地址。
  4. 8086CPU不支持将数据直接送入段寄存器的操作,可用一个寄存器来进行中转,即先将1000H送入一个一般的寄存器,如bx,再将bx中的内容送入ds。
  5. push ax表示将寄存器ax中的数据送入栈中,pop ax表示从栈顶取出数据送入ax。8086CPU的入栈和出栈操作都是以为单位进行的。
  6. 8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素
  7. push ax的执行,由以下两步完成。
    (1) SP=SP-2, SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
    (2) 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
  8. pop ax的执行过程和push ax刚好相反,由以下两步完成。
    (1) 将SS:SP指向的内存单元处的数据送入ax中;
    (2) SP=SP+2, SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的 栈顶。
  9. 入栈时,栈顶从高地址向低地址方向增长。
  10. 栈空,SS:SP指向栈空间最高地址单元的下一个单元
  11. push, pop等栈操作指令,修改的只是SP。也就是说,栈顶的变化范围最大 为:0〜FFFFH。
  12. 一个栈段的容量最大为64KB

易错题:

  1. 区分字节型数据和字型数据,掌握字型数据在内存中的存储方式
  2. 如果将10000H~lFFFFH这段空间当作栈段,初始状态栈是空的,此时, SS=1000H, SP=0
  3. 注意SP在push、pop操作中的指向

四、第一个程序

知识点总结:

  1. 伪指令是由编译器来执行的指令
  2. segmentends是一对成对使用的伪指令。segment和ends的功能是定义一个段,segment说明一个段开始,ends说明一个段结束。
  3. end是一个汇编程序的结束标记
  4. assume将有特定用途的段和相关的段寄存器关联起来
  5. 一个标号指代了一个地址。比如codesg在segment的前面,作为一个段的名称,也作为该段的段地址
  6. 编程一>1.asm —>编译—>1.obj —>连接—>1.exe —>加载—>内存中的程序—>运行
  7. 程序前缀(PSP):内存区的 前256个字节中创建一个称为程序段前缀(PSP)的数据区, DOS要利用PSP来和被加载程序进行通信;
  8. 因为PSP占256(100H)字节,所以程序的物理地址是:SA+10H:0;
  9. 程序最后要加上:
    mov ax,4c00H
    int 21H
  10. 使用P命令执行int 21H

五、[Bx]和loop指令

知识点总结:

  1. [bx]同样也表示一个内存单元,它的偏移地址在bx中,段地址在ds中
  2. 描述性的符号“()”来表示一 个寄存器或一个内存单元中的内容。“()”中的元素可以有3种类型:①寄存器名;②段寄存器名;③内存单元的 物理地址(一个20位数据)。“(X)”所表示的数据有两种类型:①字节;②字
  3. 用idata表示常量
  4. loop指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作, ①(cx)=(cx)-l;②判断CX中的值,不为零则转至标号处执行程序,如果为零则向下执行。
  5. 标号代表一个地址
  6. 汇编源程序中,数据不能以字母开头,例如:A000h在汇编源程序中要写为“0A000h”
  7. Debug 和编译器对指令中的“[idata]”却有不同的解释。Debug将它解释为“[idata]”是一个内存单元,“idata”是内存单元的偏移地址;而编译器将“[idata]”解释为“idata”
  8. 汇编源程序要在“[]”的前面显式地给出段地址所在的段寄存器,即ds: [idata]
  9. 岀现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:” “cs:” “ss:” “es:” ,在汇编语言中称为段前缀
  10. (1) DOS方式下,一般情况,0:200〜0:2ff空间中没有系统或其他程序的数据或代码;
  11. 段前缀的灵活使用

易错题:

  1. 下面的程序功能是将“mov ax,4c00h"之前的指令复制到内存 0:200 处,补全程序。上机
    调试,跟踪运行结果。
    assume cs:code 
    code segment
    mov ax, code ;或 mov ax, cs
    mov ds,ax 
    mov ax,0020h 
    mov es,ax 
    mov bx,0 
    mov cx, **18h** ;或 mov cx, **17h** ;**sub cx,5** 
    s: mov al,[bx] 
    mov es:[bx],al 
    inc bx 
    loop s 
    mov ax,4c00h 
    int 21h
    code ends 
    end 
    
    此题有多个答案,因为mov 用在寄存器之间传送数据的指令是 2 个字节,用在寄存器和立即数之间是 3 个字节
    答案 1:mov ax,cs (占 2 个字节)
    mov cx,17h
    答案 2:mov ax,code (占 3 个字节)
    mov cx,18h
    答案 3:mov ax,cs 或 mov ax,code
    把 mov cx, 改成 sub cx,5h
    (因为在载入程序时,cx 保存程序的长度,减去 5 是为减去 mov ax,4c00h 和 int 21h 的长度)

六、包含多个段的程序

知识点整理:

  1. “dw”的含义是定义字型数据。dw即“define word”,数据之间以逗号分隔;dw定义的数据处于代码段的最开始,所以偏移地 址为0,
  2. 一个段的容量不能大于64KB
  3. 对于不同的段,要有不同的段名。

易错题:

  1. 对于如下定义的段:
    name segment

    name ends
    如果段中的数据占 N 个字节,则程序加载后,这段实际占有的空间为 (N/16+1)*16. (N/16 为取整数部分)
  2. 将下面的程序编译连接,用 Debug 加载、跟踪,然后回答问题
assume cs:code,ds:data,ss:stack 
code segment 
start: mov ax,stack 
mov ss,ax 
mov sp,16 
mov ax,data 
mov ds,ax 
push ds:[0] 
push ds:[2] 
pop ds:[2] 
pop ds:[0] 
mov ax,4c00h 
int 21h 
code ends 
data segment 
dw 0123H,0456H 
data ends 
stack segment 
dw 0,0 
stack ends 
end start 

① CPU 执行程序,程序返回前,data 段中的数据为多少? 解:不变
② CPU 执行程序,程序返回前,cs=155ah、ss=155eh、ds=155dh。 (此题结果
因环境而异,但相对差值不变)
③ 设程序加载后,code 段的段地址为 X,则 data 段的段地址为 X+3,stack 段的段地址为 X+4。

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
汇编语言是一种低级的计算机语言,它直接与计算机硬件进行交互。下面是汇编语言的基础知识整理: 1. 汇编语言的作用:汇编语言用于编写底层程序,如操作系统、驱动程序和嵌入式系统等。 2. 汇编语言的特点:汇编语言是一种符号化的机器语言,使用助记符来代替二进制指令,使程序更读和理解。 3. 寄存器寄存器汇编语言最基本的数据存储单元,用于存储数据和执行运算。常见的寄存器有通用寄存器、指针寄存器和标志寄存器等。 4. 指令:汇编语言的指令是对计算机硬件进行操作的命令。指令包括数据传输指令、算术运算指令、逻辑运算指令和控制指令等。 5. 内存访问:汇编语言通过内存地址来读取和存储数据。内存地址由段地址和偏移地址组成,通过段地址和偏移地址可以唯一确定内存的一个位置。 6. 标志位:标志位是标记计算机状态的标志位,用于判断运算结果是否满足某些条件。常见的标志位有零标志位、进位标志位和溢出标志位等。 7. 标号和跳转:汇编语言可以使用标号来标记程序的位置,通过跳转指令可以根据条件或无条件地跳转到指定的标号处。 8. 子程序和栈:子程序是一段独立的代码块,可以在程序被多次调用。栈是一种后进先出的数据结构,用于保存程序执行过程的临时数据和返回地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值