实验五

实验任务1:

1.运行程序 用r查看寄存器值 cs:076c,ss:0769,ds:075a

2.用u命令反汇编 

知道程序返回前应是0019

3.用g命令执行到001d 查看data中的值 关掉程序重新debug 对比076a中0~f 值不变

回答:1、data中数值不变 如上图

          2、程序返回前cs:076c ds;076a ss:076b

          3、data地址为x-2,stack为x-1

实验任务2:

1. debug代码 观察cs的值,用u反汇编

2. 用g命令执行

 

回答:1、data中值没变

          2、可见CS:076C,SS:076B,DS:076A

          3、设程序加载后,code段的段地址为X,则data为X-2,stack为X-1

     4、该段实际占有的空间:(N/16+1)*16   也就是说 不满16的空间会被自动补全

实验任务3:

1、debug后用u查看 用g运行到程序返回前

data中数据:

ds:076d ss:076e cs:076a

data地址x+2 stack地址为x+4

实验任务4:

在notepad中修改123的指令end start->end

例如运行程序1 用u反汇编

不是我们想要看到的代码 说明程序失败

实验二同样这样 只有实验三可以

实验任务5:

代码:

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

c segment  
  db 8 dup(0)
c ends     
code segment
start:
  mov cx,8
s:mov dx,0
  mov ax,a
  mov ds,ax
  add dl,[bx]
  mov ax,b
  mov ds,ax
  add dl,[bx]
  mov ax,c
  mov ds,ax
  mov [bx],dl
  inc bx
  loop s
  mov ax,4c00h
  int 21h
code ends
end start

在dosbox中debug 用u反汇编 用g执行到返回前

查看实验结果 ds即是c的段地址 发现程序运行成功 

在程序运行前ds:

程序运行后:

 实现了a和b的相加

实验任务6:

实验代码;

assume cs:code
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,0fh
  mov cx,8
s:push [bx]
  add bx,2
  loop s
  mov ax,4c00h
  int 21h
code ends
end start

如图执行到push之前

此时ss中均为0

再运行到程序返回之前

可见程序完成了要求

实验总结: 在执行多段程序中 end start必不可少 不然程序无法找到执行的入口

                  8086机制下,不管data段等内容满不满16 都会自动补全。

                  此次试验巩固了各种命令的使用。

原文地址:https://www.cnblogs.com/masami/p/10012935.html