第一章 基础知识
1.汇编语言有以下三类指令组成:
(1)汇编指令:机器码的助记符,有对应的机器码。
(2)伪指令:没有对应的机器码,由编译器执行,计算机并不执行。
(3)其他符号:如:+、-、*、/等,由编译器识别,没有对应的机器码。
第二章 寄存器
1.使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的变化。
执行之前:
执行第一条指令之后,ax=4e20
执行第二条指令之后,ax=6236
执行第三条指令之后,bx=2000
执行第四条指令之后,ax=8236
执行第五条指令之后,bx=8236
执行第六条指令之后,ax=046c(8236h+8236h=1046ch,溢出,只保存046c)
执行第七条指令之后,ax=001a
执行第八条指令之后,bx=0026
执行第九条指令之后,ax=0040
执行第十条指令之后,ax=2640
执行第十一条指令之后,bx=4026
执行第十二条指令之后,ax=0040
执行第十三条指令之后,ax=0066
执行第十四条指令之后,ax=0002
2.将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
输入指令执行即可。
3.查看内存中的内容。
PC机主板上的ROM写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。
第三章 寄存器(内存访问)
1.使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实验运行情况填空。
mov ax, ffff
mov ds, ax
mov ax, 2200
mov ss, ax
mov sp, 1000
mov ax,[0] ;ax = 5bea
add ax,[2] ;ax = 5cca
mov bx,[4] ;bx = 31f0
add bx,[6] ;bx = 6121
push ax ;sp = 00fe 修改的内存单元的地址是220fe内容为5cca
push bx ;sp = 00fc 修改的内存单元的地址是220fc内容为6121
pop ax ;sp = 00fe ax = 6121
pop bx ;sp = 0100 bx = 5cca
push [4] ;sp = 00fe 修改的内存单元的地址是220fe内容为31f0
push [6] ;sp = 00fc 修改的内存单元的地址是220fc内容为2f31
2.仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
在使用t命令时,执行到mov ss,ax时,由于ss保存段地址,sp保存偏移地址,需要连续执行这两条指令,会发生中断,为了保护现状,CPU将CS和IP,此时的位置,入栈,由于目前开辟的栈空间在2000:0~2000:f之间,这就导致了内存相关位置内容的改变。
第四章 第一个程序
1.将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe。
assume cs:codesg
codesg segment
mov ax, 2000H
mov ss, ax
mov sp, 0
add sp, 10
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax, 4c00h
int 21h
codesg ends
end
使用radsam。新建工程,生成可执行exe文件。
2.用Debug跟踪t1.exe的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。
使用debug加载exe文件后:
单步执行后:
ax 2000H |
ss 2000H |
sp 0000H |
sp 000AH |
ax 0 sp 000cH |
bx 0 sp 000EH |
sp 000cH |
sp 000AH |
ax 0 sp 000cH |
bx 0 sp 000EH |
ax 4c00H |
empty |
3.PSP头两个字节为CD 20,用debug加载t1.exe,查看PSP内容
使用D命令,查看ds:0就可以了。因为DS寄存器的初始化值为PSP的段地址。
第五章 [BX]和loop指令
1.编程,向内存0:200~0:23F依此传送数据0~63(3FH)。
assume cs:code
code segment
start:
mov ax,0000h
mov ds,ax
mov bx,0200h
mov dx,0000h
mov cx,64
s:mov ds:[bx],dl
inc dx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
2.编程,向内存0:200~0:23F依此传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax, 4c00h”和“int 21h”。
;向内存0:200~0:23F依此传送数据0~63(3FH)。
assume cs:code
code segment
start:
mov ax,0200h
mov ds,ax
mov bx,0000h
mov cx,64
s:mov ds:[bx],bl
inc bl
loop s
mov ax,4c00h
int 21h
code ends
end start
3.下面的程序的功能是将“mov ax, 4c00h”之前的指令复制到内存的0:200处,补全程序,上机调试,跟踪运行结果
assume cs:code
code segment
mov ax, __cs__
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, ___23__
s: mov al, [bx]
mov es:[bx], al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
第六章 包含多个段的程序
1.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。
debug加载exe后,使用u查看
①data段中的数据为0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
②cs=0b87 ss=0b86 ds=0b85
③code:x data:x-2 stack:x-1
2.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。
①data段中的数据不变
②cs=0b87 ss=0b86 ds=0b85
③code:x data:x-2 stack:x-1
④([N]+1) * 16 (字节对齐)
3.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。
①data段中的数据不变
②cs=0b87 ss=0b86 ds=0b85
③code:x data:x+3 stack:x+4
4.如果将1. 2. 3.题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
程序3,在不指明程序入口的情况下,程序默认按照顺序从头开始执行.
5.程序如下,编写code段中的代码,将a段和b段中的数据依此相加,将结果存到c段中
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
d segment
db 0,0,0,0,0,0,0,0
d ends
code segment
start:mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,d
mov ss,ax
mov bx,0h
mov cx,8
s:
mov al,[bx]
add al,es:[bx]
mov ss:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
6.程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。
start:
mov ax, b
mov ss, ax
mov sp, 16
mov ax, a
mov ds, ax
mov bx, 0
mov cx, 8
s:
push [bx]
add bx,2
loop s
mov ax, 4c00H
int 21h