任务一:执行以下代码之后,得出结果。
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
数据段中的数据:较之前并未改变

第一次找到的数据:原因是076C:0041 不是结束地址

第二次:cs:001d是汇编之后的代码结束地址(cx代表所有指令所占字长?)

程序加载后,code段地址为X,data段地址为X-2,stack段地址为x-1;
任务二:
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
查看ds:正误对照如下

结束地址仍然是001d,见上图。

程序加载后,code段地址为X,data段地址为X-2,stack段地址为x-1;
如果段中数据占N个字节,则程序加载后,该段实际占有空间为: [(N+15)/16]*16。内存是以十六个字节为单位进行内存分配的。(来自http://www.cnblogs.com/gemini233/p/10003997.html )
任务三:
注:需要-g之后用可以查看ds。否则:

cs,ds,ss地址,ds内容分别如下。

程序加载后,code段地址为X,data段地址为X+3,stack段地址为x+4;
如果将(1)、(2)、(3)题中的“end srtart”改为“end” 不指明程序入口,程序执行情况会怎样?
第一次实验结果:和前一次并无二致---针对(3)

修改(1):

上图是拓展名称导致的问题;

与之前代码的明显区别。
修改(2):

也可见明显区别。
(1)和(2)会发生改变,取消 指明代码段开始位置,会从IP=0处开始执行,(1)和(2)对应的而是数据段。
(3)中IP=0处证号就是代码段开始的位置,因此去除“start”不会产生影响。(获得从博客:http://www.cnblogs.com/gemini233/p/10003997.html)
任务五:编写code段中代码,将a段和b段中的数据一次相加,将结果加入到c段。
根据定位的规律,以每16个字节为单位进行内存分配。
我使用的其他人的做法。
assume cs:code
a1 segment
db 1,2,3,4,5,6,7,8
a1 ends
b1 segment
db 1,2,3,4,5,6,7,8
b1 ends
c1 segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
db 8 dup(0)
c1 ends ; 改的时候要成对一起修改
code segment
start:
mov ax,a1;数据段a
mov ds,ax
mov bx,0
mov cx,8
s: mov ax,[bx];指定起始位置
add ax,[bx+10h];段的之间相差整数个10h
mov [bx+20h],ax
add bx,2;每次增加两个字节
loop s
mov ax,4c00h
int 21h
code ends
end start
原理:将[bx],以及[bx+10H]中的数据放在ax寄存器中,c1内存地址是[bx+20h]

实际操作的时候,对内存单元进行add 还是 mov的指令不够明确。
先让一个数据段的内容放入ax寄存器中,利用指针偏移地址(类似数组)进行累加,最后送入c1段中。
任务六:编写code段用push 指令将a段中的前8个字型数据,逆序存储到b段中。
思想:栈顶指针随push 进行的元素增加而减小(往上移动),原本大的数字由于栈(由底向上存储的机制)而放在一开始。
我一开还想着要用pop 实在是没有必要,也反映出逻辑条理不够清晰就写代码。

一开始没有做出来,发现是循环控制定位点 给错了。push的过程就是逆序的过程。
浙公网安备 33010602011771号