汇编实验五

一、实验内容-教材133实验 5 

实验任务(1)~(4),

直接在教材上填写实验后通过运行、调试观察到的结果,以及由此得 到的结论,以拍照或直接在博客中录入方式,给出填写的结论。

1)书上P134的源码如下:

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

在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令

观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为

0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h

同时也能看出cs=076ch,ss=076bh,ds=076ah,推断出cs、ss、ds之间的规律

由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X-2,stack中的段地址为X-1

2)书上P135源码如下

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 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

在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令

观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为

 0123h, 0456h

同时也能看出cs=076ch,ss=076bh,ds=076ah,推断出cs、ss、ds之间的规律

由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X-2,stack中的段地址为X-1

 对于第四小问,分N分为被16整除和不被16整除讨论 1)当N被16整除时: 占有的空间为(N/16)*16     2)当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。

程序加载后分配空间是以16个字节为单位的,也就是说如果不足16个字节的也分配16个字节。以上两种情况总结成一个通用的公式:((N+15)/16)*16 【详解参考王爽的课后答案】

3)书上P135源码如下:

assume cs:code, ds:data, ss:stack

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
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0,0
stack ends
end start

在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令

观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为

 0123h, 0456h

同时也能看出cs=076ah,ss=076eh,ds=076dh,推断出cs、ss、ds之间的规律

由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X+3,stack中的段地址为X+4

4)第三个程序仍然可以正确执行,请说明原因???我运行了啊,,,

“如果不指明入口位置,则程序从所分配的空间开始执行,前2个是数据段,只有从第3条开始是指令代码。”———来自参考答案

实验任务(5),

~(1) 汇编程序源代码(已将此处的段名称由改为c1)

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

c1 segment
db 8 dup(0)
c1 ends
code segment

start: mov ax,c1
mov ds,ax
mov ax,a
mov es,ax

mov bx,0
mov cx,8
s: mov al,es:[bx]
mov [bx],al
inc bx
loop s

mov ax,b
mov es,ax

mov bx,0
mov cx,8
s0: mov al,es:[bx]
add [bx],al
inc bx
loop s0

mov ax,4ch
int 21h
code ends
end start

~(2) 在debug中调试程序截图,截图中包括如下信息: ① 在实现数据相加前,逻辑段c的8个字节 ② 执行完实现加运算的代码后,逻辑段c的8个字节

依次使用g命令,d命令,在执行后查看a、b、c段中的存储数据

再执行倒数第二步,查看c段中此时存储的数据

 

~(3) 根据①和②的调试,验证是否正确的实现数据相加。

 由上图可知,已经实现相加,大概正确吧。

实验任务(6),

~(1) 汇编程序源代码

assume cs:code
a segment
    dw 1,2,3,4,5,6,7,8
a ends
b segment
    dw 0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax,a
       mov ds,ax   
       mov ax,b
       mov bx,0    
       mov ss,ax
       mov sp,16  
       mov cx,8
    s: push [bx]
       add bx,2
       loop s     
code ends
end start

~(2) 在debug中调试程序截图,截图中包括如下信息: ① 在push操作执行前,查看逻辑段b的8个字单元信息截图 ② 执行 push操作,然后再次查看逻辑段b的8个子单元信息截图

 使用G命令,D命令,执行并查看a段,b段中存储的数据,以及b中最终存储的数据

~(3) 根据①和②的调试,验证是否正确的实现数据逆序存储。

 由上图可知,已经实现数据逆序存储。

二、实验总结

对于课上讲的“利用栈将程序中定义的数据逆序存放”,没懂为什么要用dw定义16个0,只用8个不可以吗???试了一下好像可以,没出什么问题

实验任务6中我使用U命令之后出现了一行"CLD",在使用G命令执行时才看到,但是对汇编指令执行没有产生影响

查阅之后,有这样的解释

原文地址:https://www.cnblogs.com/kori/p/9999206.html