阅读汇编程序
1.若有以下变量定义,请说明下面的程序执行后,AX的内容是什么?
TABLE DW 40,50,20,30
ENTRY DW 3
┊
MOV BX, OFFSET TABLE
ADD BX,ENTRY
MOV AX,[BX]
小端存储:低地址存低位。
低地址 28 32 14
高地址 00 00 00
(AX)=1400H
2.分析下列程序完成的功能
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
MOV AH, 02H和INT 21H调用 DOS 的显示字符功能,DL中存放要显示的字符的 ASCII 码。先输出
0DH(回车,CR),将光标移到当前行首。再输出
0AH(换行,LF),将光标下移到下一行。组合起来即实现标准意义上的"换行"操作,类似于 C 语言中的
\r\n
使光标回车+换行
3.在下述指令串执行后,画图表示出物理地址为0110AH~0110FH的各单元存放的内容。
START:
MOV AX,00C0H
MOV DS,AX
MOV BX,0500H
MOV CX,0010H
AGAIN:
MOV [BX],BL
INC BL
LOOP AGAIN
DS=00C0H→ 段基址 =00C00H
BX初始 =0500H
CX=0010H(16次循环)循环体:
MOV [BX], BL→INC BL→LOOP同时物理地址 = 段基址 × 16 + 偏移地址:
DS = 00C0H→ 段基址 =00C00H
BX从0500H开始,每次循环INC BL会让BX加 1(因为低 8 位从00H增到0FH,没有进位到BH),所以偏移地址依次为:
0500H, 0501H, 0502H, ... , 050FH第一次写入:偏移
0500H→ 物理地址00C00H + 0500H = 01100H,写入BL = 00H最后一次写入:偏移
050FH→ 物理地址00C00H + 050FH = 0110FH,写入BL = 0FH
物理地址 内容
0110AH 0AH
0110BH 0BH
0110CH 0CH
0110DH 0DH
0110EH 0EH
0110FH 0FH
4.分析下列程序完成的功能
MOV AL,05H
SHL AL,1
MOV BL,AL
MOV CL,03H
SHL AL,CL
ADD AL,BL
SHL:逻辑左移(低位补0,高位进CF)
5*2*8+5*2=5*18=90
将90存到AL中
5.有程序段如下,指出执行后(AX)的值:
MOV DX,5678H
MOV BX,1234H
PUSH BX
PUSH DX
PUSH BP
MOV BP,SP
MOV AX,[BP+4]
POP BP
POPDX
POPBX
PUSH :压栈,SP先减2,后传送
PUSH AX(SP=SP-2, SP←AX)POP :出栈,先取数据,SP加2 (Push的逆操作)
POP BX(BX←SP, SP=SP+2)低地址 → 原BP ← SP
5678H
1234H
高地址
(AX)=1234H
6.已有BUF DB 0DH 定义,分析下列程序段
MOV AL,BUF
CALL FAR PTR HECA
OK:
HECA PROC FAR
PUSH AX
CMP AL,10
JC K1
ADD AL,7
K1:ADD AL,30H
MOV DL,AL
POP AX
RET
HECA ENDP
① 写出子程序HECA的说明文件。
② 程序执行到OK处,(DL)= H
CALL:子程序调用指令。
FAR PTR :远指针属性操作符,强制指明被调用过程为远过程(段间调用)。
HECA:目标过程名。
统一执行步骤:将 AL 加上 30H(48 十进制)。
数值 0~9:加 30H → 30H~39H('0'~'9')。
数值 10~15:先前已加 7,现在加 30H 相当于总加 37H → 41H~46H('A'~'F')。
①
-
子程序名:HECA
-
功能:将 AL 中的一位十六进制数(00H~0FH)转换为 ASCII 字符。
-
入口参数:AL = 待转换的十六进制数值(应为 0~15,超出范围结果无定义)。
-
出口参数:DL = 转换后的 ASCII 码('0'~'9' 为 30H~39H,'A'~'F' 为 41H~46H)。
-
所用寄存器:AL、DL,并通过栈保存/恢复 AX。
-
调用方式 :远过程(FAR),使用
CALL FAR PTR HECA。 -
算法:若 AL < 10,加 30H;否则加 37H(等价于先加 7 再加 30H)。
②(DL)=44H
7.分析下列程序段,说明完成了什么操作?程序执行前后,HEXNUM字节单元的内容是什么?
ASCNUM DB 41H
HEXNUM DB ?
MOV AH,ASCNUM
CMP AH,39H
JBE NEXT
SUB AH,7
NEXT: SUB AH,30H
MOV HEXNUM,AH
HLT
将ASCNUM单元的字符转换成对应的一位16进制数,并将转换后的结果存到HEXNUM单元。
HEXNUM:0AH
8.分析以下程序段完成的功能
SUB1 PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX, 00FFH
AGAIN: NOP
LOOP AGAIN
POP DX
POP CX
POP BX
POP AX
RET
SUB1 ENDP
一个简单的软件延时子程序,通过在 255 次循环中执行 NOP / LOOP 指令消耗 CPU 时间,实现短暂停顿。延时前后保护并恢复了四个通用寄存器,对调用者无副作用。
数据存储器分析以及数据移动操作汇编
1.下图为某80XCPU扩展外部存贮器电路,试问
1)该外部扩展的数据存储器容量是多少?三片6264的地址范围分别是多少?(假设段地址为6000H,其他地址线未用到的位填1,)
2)编写程序,将电路中6264 2# 的前32个单元的内容送入6264 1# RAM的前32个单元中。(要求用8086汇编语言编写)

(1)3*8Kb*8=24KB
芯片 A15 A14 A13 对应地址范围(段地址 6000H,高4位填1)
6264 1# 0 0 0 F6000H ~ F61FFFH
6264 2# 0 0 1 F6200H ~ F63FFFH
6264 3# 0 1 0 F6400H ~ F65FFFH
(2)
; 假设系统处于实模式,可直接操作物理地址
; 设置段寄存器:ES指向目的段(6000H),DS指向源段(6200H)
MOV AX, 6000H ; 目的段地址(1#)
MOV ES, AX
MOV AX, 6200H ; 源段地址(2#)
MOV DS, AX
XOR SI, SI ; 源偏移地址 0
XOR DI, DI ; 目的偏移地址 0
MOV CX, 32 ; 传送 32 字节
CLD ; 地址递增方向
REP MOVSB ; 重复执行 MOVSB,从 DS:SI 到 ES:DI
若使用循环实现,可替换 REP MOVSB 为:
NEXT:
MOV AL, [SI]
MOV ES:[DI], AL
INC SI
INC DI
LOOP NEXT
2.下图为某80XCPU扩展外部存贮器电路,试问
1)RAM和EPROM的存储容量各是多少?RAM和EPROM存储器分配的地址范围各是多少?
2)编写程序,将电路中EPROM的前32个单元的内容送入RAM的前32个单元中。(要求用8086汇编语言编写)

RAM:2KB
EPROM:4KB

; 将EPROM前32个单元传送到RAM前32个单元
; EPROM地址:05000H~0501FH
; RAM地址:01000H~0101FH
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA
START:
; 设置数据段寄存器(RAM段)
MOV AX, 0100H ; RAM段基址 = 01000H / 16 = 0100H
MOV DS, AX ; DS指向RAM段
; 设置附加段寄存器(EPROM段)
MOV AX, 0500H ; EPROM段基址 = 05000H / 16 = 0500H
MOV ES, AX ; ES指向EPROM段
; 设置偏移地址和计数器
MOV SI, 0000H ; 源偏移地址(EPROM:0000H)
MOV DI, 0000H ; 目的偏移地址(RAM:0000H)
MOV CX, 20H ; 传送32个字节(20H = 32)
; 方向标志:地址递增
CLD ; DF=0,SI、DI自动递增
; 重复传送
NEXT:
MOV AL, ES:[SI] ; 从EPROM取一个字节
MOV [DI], AL ; 存入RAM
INC SI ; 源地址+1
INC DI ; 目的地址+1
LOOP NEXT ; CX-1,若CX≠0则继续
; 程序结束
MOV AH, 4CH ; DOS功能号:返回
INT 21H
CODE ENDS
END START
串操作写法:
与前面到Next字段前相同
REP MOVSB ; 重复传送字节串 [DS:SI] → [ES:DI]
MOV AH, 4CH
INT 21H
CODE ENDS
END START
