2024-2025-1 山东大学《汇编语言》期末(回忆版)
计算机科学与技术学院:潘润宇老师
选择
- 将机器语言目标文件组装成可执行文件的实用程序是?
- 设 SP 初值为 1000H,执行指令 RETF 后,SP 为?
- 8086 通用寄存器不包括哪个?
- AX;BP;SP;IP
- FLAGS 寄存器中,OF 位和 CF 位关系?
- OF 置位则 CF 置位;CF 置位则 OF 置位;OF 和 CF 总是同时置位;无必然联系
- 给了四条具体指令,找出错误的那条
- 给了四条具体指令,问 8086 不支持哪一条
- 已知(BX)= 2000H,(BP)= 1234H,问 MOV AX, [BX + BP + 2] 的目的操作数在哪?
- 在 AX 寄存器中;在代码段偏移地址 3234H 处;在栈段偏移地址 3236H 处;编译不通过
- 对小端字节序的计算机而言,设物理地址(10FF0H)= 10H,(10FF1H)= 20H,(10FF2H)= 30H,如从地址 10FF1H 中取出一个字的内容是?
- 给一 C 语言片段,问适合什么寻址方式
- 键盘上按键的扫描码和 ASCII 码?
- 扫描码可以不存在;ASCII 码可以不存在;扫描码和 ASCII 码都可以不存在;扫描码和 ASCII 码一定相同
填空
- 给定一中断号,求中断向量的 CS 的物理地址
- 给一物理地址,问有多少种段基址和偏移地址组成满足该物理地址
- 进制转换(9 进制数转 5 进制)
- 求补码
- 8086 中,除直接寻址外,哪个寄存器的段寄存器和其他寄存器的段寄存器不同?这个不同的段寄存器是哪个?其他寄存器的段寄存器一般是哪个?
- 外设编址方式有?8086 是哪种?
- 统一编址、独立编址;独立编址
- 多(大于 2)分支结构有哪两种类型?如果数据满足某些限制,哪一种效率更高?
- 子过程传参最简单的方式是什么?除此之外,还有哪两种方式?
- 8086,在程序开始前需要设置 DS,通常需要通过 AX 来进行设置,为什么?
- 0AH 读入字符串长度最大为 12H,问 DX 是多少?
问答
汇编语言?
由助记符和操作数组成的汇编码作为基本元素的、直接描述计算机硬件基本操作序列(指令流)的编程语言
8086 指令分类?
数据传送、算术运算、位操作、串操作、控制转移、处理机控制
数据传送方式有哪些?外设有哪几个寄存器?
- 直接交换、查询(轮询)、中断、成组传送
- 数据寄存器、命令寄存器、状态寄存器
画出"直到…不成立"型循环结构的流程图
阅读
DSEG SEGMENT
ARRAY DB 75H, 70H, 0AAH, 0C3H
DB ...
; ARRAY 具体数忘了,总之是有 10 个数
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START:
MOV AX, DSEG
MOV DS, AX
MOV CX, 9
OUTER:
XOR SI, SI
INNER:
MOV AX, ARRAY[ SI ]
MOV BX, ARRAY[ SI + 1 ]
CMP AX, BX
JL SKIP
XCHG AX, BX
MOV ARRAY[ SI ], AX
MOV ARRAY[ SI + 1 ], BX
SKIP:
_______________ ; 此处待填充
CMP SI, 9
JNZ INNER
LOOP OUTER
CSEG ENDS
END START
- 指出代码段中的两种错误,在更正错误后,填充代码段中空出来的那一行
- 问该程序很有可能实现什么算法?更正上述错误后,ARRAY 结果是?
- 该算法效率还可以优化,为什么?如何优化?
编程
ARM 架构有一条 RBIT 指令,如 R1 = 1100 0010 0001 1110,执行 RBIT R1, R1 后,R1 = 0111 1000 0100 0011,即将 R1 反转,结果存回 R1。8086 没有该指令,请用近过程或宏来实现该指令。要求把 DX(高位):AX(低位) 反转,结果存回 DX:AX
-
基本要求:
- 程序大体正确,无明显错误
-
额外要求:
- 要求该过程/宏在结束时,不影响除 AX、DX 外的其他通用寄存器
- 要求该过程/宏在结束时,不影响 FLAGS 寄存器
- 这条要求太长,忘了具体,大概是和时钟周期有关的
- 要求该过程/宏是一个原子操作
-
提示:可通过逻辑左右移实现,以下代码仅供参考
REVERSE MACRO
; 反转 AX,结果存入 BX
LOCAL RAX, RB, NEXT
MOV CX, 16
RAX:
SHR AX, 1
JC RB ; 若 AX 右移出的那一位是 1,则跳转到 RB
SHL BX, 1 ; 若 AX 右移出的那一位是 0,则直接让 BX 逻辑左移 1 位即可
JMP NEXT
RB:
SHL BX, 1 ; 若 AX 右移出的那一位是 1,则先让 BX 逻辑左移 1 位
INC BX ; 然后让 BX 末尾加 1
NEXT:
LOOP RAX ; 继续下一位直到 AX 全部反转到 BX
ENDM
RBIT MACRO
; 通过调用两次 REVERSE 实现反转 DX:AX
CLI ; 关中断
; 保存寄存器
PUSH BX
PUSH CX
PUSH FLAGS
;
REVERSE ; 先反转 AX,结果存入 BX
MOV AX, DX ; 将 DX 覆盖 AX
MOV DX, BX ; 将上面原本 AX 的反转结果存 DX
REVERSE ; 再反转现在的 AX,也就是反转原本的 DX
MOV AX, BX ; 将反转结果写入 AX 即可
; 恢复寄存器
POP FLAGS
POP CX
POP BX
STI ; 开中断
ENDM
以上回忆版仅供参考,预祝各位都能取得自己理想的成绩!