*任务(1)(2)(3)基本步骤相同,这里只列举出(1)的实验步骤
步骤一:把要使用的代码粘贴到masm文件夹中。
步骤二:编译、连接、用debug调试。
步骤三:用r命令查看各寄存器的值。
cs是code的段地址,ds是data的段地址,ss是stack的段地址。这是因为代码前面的声明: assume cs:code, ds:data, ss:stack
步骤四:用u命令反汇编,注意反汇编是code段,所以u命令后接的应该是cs。
步骤五:用g命令执行,根据反汇编得到的代码,执行到mov ax,4c00之前。这里g命令的使用是断点的使用。
步骤六:使用d命令查看data段的值。由于data的段地址是ds,所以从ds:0到ds:f查看16个字节。
*任务(2)(3)步骤大同小异,这里就不多列举了。
实验结果:
任务一:
任务二:
任务三:
任务四:
任务一修改:
任务二修改:
任务三修改:
结论:从反汇编可以看出,把end start改成end后,只有实验三可以正常运行。
分析:start提供程序的入口,使cs:ip 指向第一条要执行的指令。任务一和任务二的代码中,汇编指令代码段并不是在开头,所以cs:ip在默认的开头;任务三的汇编指令代码在开头,cs:ip刚好指向她。
关于任务二的第4小问:举ex5_1为例;其存储数据的段地址是ds。
①ex5_1源代码:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
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
end start
经过编译连接运行后,使用r命令查看,ds=075a , ss=076b , cs=076c,这意味着给data段落分配了10h,即16字节的空间。
②ex5_1_2源代码(data段落的字节给了17个字节的数据): (此步骤也可以使用任务三的各个寄存器的值)
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h,0123h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
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
end start
经过编译连接运行后,使用r命令查看,ds=075a , ss=076c , cs=076d,这意味着给data段落分配了20h,即32字节的空间。
结论:由此看来,储存的数据不足16字节,给他分配16字节的空间;储存的数据多于16字节的整数倍,则会给多余的、不满16字节的数据分配一整的16字节的空间。
答案:(N/16+1)*16
另外,在修改程序的过程中,如果把英文字符写成中文字符,例如:把 ”,“ 写成 ”,“,会出现如下错误:
任务五:
源代码:
assume cs:code, ds:a, es:b, ss:c
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
c segment
db 8 dup(0)
c ends
code segment
start:
mov ax,a
mov ds,ax mov ax,b
mov es,ax
mov ax,c
mov ss,ax mov cx,8 mov bx,0
s: mov al, ds:[bx]
add al, es:[bx]
mov ss:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
①编译、连接
②debug执行,d命令查看c段
③u命令反汇编,g命令执行
④d命令查看c段
任务六:
assume cs:code,ds:a,ss:b
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 8 dup(0)
b ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,10H
mov bx,0
mov cx,8
s:push [bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
①编译、连接
②d命令查看执行前ss段
③debug执行,r命令查看各寄存器初始值,u命令反汇编,g命令断点执行
④d命令查看执行后ss段