整点薯条

没有薯条的码头毫无意义。

0%

汇编与接口 汇编复习建议

学习内容

  • 第一章看一看 PPT 过一遍即可,一些概念性的记一下,可能出个填空题啥的

  • 第二章看书+PPT

  • 汇编部分第三章 PPT+书一起看,PPT 上有一些题目看一下,然后就是书上有一些伪指令是 PPT 里没有的可以看看

  • 第四章内存部分应该会考一个硬件分析让你写出地址空间啥的,这块看看 PPT 然后书上再选两题看看,书里都有解析,还有前年试卷的分析题也是这种类型,今年期末考也考了

  • 接口部分 PPT 的章节和书的章节是不一样的,根据 PPT 里的芯片名字去目录里找对应的章节看,咱们学习的是 8259,8255,0832,0809,8237,8255,8251,8253 这几个芯片,还有这一块 PPT 里有个中断的部分,也要看一下

  • 有不懂的地方可以去找慕课看一下,也可以随时问我

考试重点

不知道题型与期末考一不一样,但是重点应该是一样的,选择题、填空题、判断题、简答题这种也没法预测,只能自己看 PPT 和书的时候多注意一下,这几种题型可以看看何燕平老师的 2017 复习 PPT,大概整体复习完一遍后,去做一做前年的试题

  • 选择题(举例)

    • PC 里放的是啥

    • 中断向量、中断向量表、中断入口程序地址

  • 填空题(举例)

    • 给你一条指令,问寻址方式

    • 中断的分类

  • 判断题

  • 简答题(举例)

    这个也不太好说他会出什么,说不定 ppt 里不在意的地方他就出了…,比如接口的功能、中断的分类…

    • 字节对齐问题

      MOV AX,[2000H]MOV AX,[2001H]的区别

    • 8086 采用的编址方式,这种编址方式有什么优点/缺点

    • 结合 8259 内部结构,描述中断源如何向 8259 提出申请,8259 如何判优等等类似的问你一个芯片的工作过程这样

    • 给一段汇编伪指令,画出内存空间(课本第三章那块有)

    • 中断响应过程

    • 搞个宏展开

  • 计算题

    • 波特率的计算应该必考

      1. 注意一帧要包括起始位、有效位、奇偶校验位、停止位,题目可能只告诉你几位有效位、几位停止位,采用奇校验还是偶校验,计算的时候要记得加上 1 位起始位。

      2. 波特率、波特率因子与发送/接收时钟频率的关系

        $发送/接收时钟频率(Hz) = 波特率(bps)*波特率因子$

  • 分析题

    • 硬件分析

      • 存储器扩展 [例题见第四章 PPT 第 17 页、前年考卷分析题](应该必考

        给你一个图,让你写出内存地址范围,问是否存在地址重叠

    • 软件分析

      给你一段代码,问你运行结果、各存储器的变化之类的,这里要注意隐含的变化,比如出栈入栈时 SP 的变化、串操作指令中 SI、DI 的变化、各个指令对标志位的影响等等

  • 设计题

    • 汇编编程部分(难度应该和实验难度差不多)

      • 写出程序的一部分/子程序

        1. 跳转、循环、排序、比较、递归、累加、阶乘…

        2. 显示 16 进制数/字符/字符串/…

        3. 从键盘键入字符串(21H 各号功能)

          从键盘接受一个 16 位/10 位的数…

      • 写出一个完整的汇编程序

      注意:

      • 子程序要有 ret

      • 对于某些指令注意指明操作数的位数,如MOV BYTE PTR [DI],0FFH

      • 注意题目要求,要的是字还是字节操作

      • 若要编写完整程序,要注意伪指令的完整结构,包括常用的伪指令、段的定义、程序开始和结束(4C00H)等

      • 对于字符串处理指令,用之前别忘了设置 DF

    • 接口

      • 8255重点,接数码管/小键盘,可以看看书上(我记得好像是有代码的)、实验代码,顺便一般都是方式 0 工作

        注意就算到时候写不出来,也不要空着,至少要能写出 A 口、B 口、C 口、控制口的端口地址,控制字初始化也得会写,设置内存起始地址啊之类的,总之能写多少就写多少

      • 0809/0832 可能会考一个,这两个看看 PPT,一步一步写,至少写出端口、通道地址

      • 8259重点,同样的,就算写不出来,也要能写多少写多少,至少会写端口地址、控制字的初始化

        • 8259 也可能出成简答之类,问你只有两个端口,那它是怎么初始化的,怎么知道是写哪个命令字啊

          [奇偶地址、顺序、特征位]

        • 也可能让你算个中断向量啊啥的

      • 8251 一般放计算题里考波特率计算

      • 8253,这个它的工作模式确实有点多…其实我自己也记不住,不过期末考的时候考了,能看看记记就记记… …

      • 8237


汇编常用

21H 中断

  • 4CH 号功能:结束程序

    MOV AX, 4C00H

  • 02H 号功能:在屏幕上显示字符

    MOV DL, ‘A’
    MOV AH, 02H

  • 01H 号功能:由键盘输入一个字符

  • 0A 号功能:由键盘输入字符串

    调用之前先设置好缓冲区,第一个字节事先填入最多允许接受的字符个数(包括 0DH),第二个字节留空,本功能自动回填实际输入的字符个数(不包括回车符),第三个字节起存放实际的字符串,用户按回车结束,从而最后一个字符是 0DH,若用户输入字符超过设置,不予响应

    • 调用参数:DS:DX=缓冲区首地址 DS:[DX]=缓冲区最大容量

    • 返回参数:DS:[DX+1]=实际输入字符数 DS:DX+2=字符串首地址

常用 ASCII 码

  • 回车 0DH

  • 换行 0AH

  • 终结符 ‘$’

编程框架

  • 框架(简略模式)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
            ;采用简化版的段定义伪指令,下一个段的开始即表示上一个段的结束
    .model small
    .stack [常量(大小为常量个字节)默认1KB]
    .data
    ; ...定义的数据
    ; [变量名] DB 操作数列表
    ; DB(define word)
    ; DD(define double word)
    ; DQ
    ; DT
    ; PORTA EQU 20H 符号常量也可用=定义
    ; PTR 类型属性操作符 转换类型 类型 PTR 变量名/含变量名的表达式
    .code [段名]
    start: mov ax, @data ; @data表示代码段名
    mov ds, ax ; 装载数据段

    ; ....一些操作

    mov ax,4c00h
    int 21h ; 调用21号中断结束汇编
    end start
  • 框架(非简略模式)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    SSTACK    SEGMEN    STACK
    DB 200 DUP(0)
    SSTACK ENDS
    DATA SEGMENT
    ; ORG 3000H ; ORG规定起始地址
    ; ARY DB 100,98,-1,-2,-4,7,0,100,32,1
    ; ARRY DQ DUP(?) ; DUP复制操作符,?表示只分配存储空间
    DATA ENDS
    CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:SSTACK
    START: MOV AX,DATA
    MOV DS,AX
    MOV AX,STACK
    MOV SS,AX
    ; CS不需要送段寄存器
    ; ...一些操作
    MOV AX,4C00H
    INT 21H ; 调用21号中断结束汇编
    CODE ENDS
    END START

其它

  • 标志寄存器 (记)

    16 位(9 位有效,7 位空闲)

    CF、DF、IF、TF 可由指令设置,其余 5 个由 EU 设置

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    OF DF IF TF SF ZF AF PF CF
  • 复位后寄存器状态

    注意 CS 复位后值为 0FFFFH

  • 关于字节对齐问题

    从偶地址单元开始读/写一个字,需要一个总线周期

    $\overline{BHE}$ $A_0$ 操作 所用数据线
    0 0 从偶地址单元读/写两个字节 $D_0$~ $D_{15}$
    1 0 从偶地址单元读/写一个字节 $D_0$~$D_{7}$
    0 1 从奇地址单元读/写一个字节 $D_8$~$D_{15}$

    从奇地址单元开始读/写一个字,需要两个总线周期

    $\overline{BHE}$ $A_0$ 操作 所用数据线
    0 1 第一步:从奇地址单元读/写一个字节 $D_8$~$D_{15}$
    1 0 第二步:从偶地址单元读/写一个字节 $D_0$~$D_{7}$
  • 关于 IP、CS 的出栈入栈顺序

    可以这么记,栈是向下生长的(地址由大到小),在栈中,保存段地址的地址总是大于保存段内偏移地址的地址

  • OFFSET 和 LEA 的区别

    OFFSET 是在编译的时候就计算出偏移结果,实际运行程序的时候已经被替换为一个数值了,而 LEA 是在运行的时候才执行


暂时想到这些,以后想到再补充吧