实例1:计算如下八个数的和,结果存放在ax中 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
分析:
可以将这八个数存放在内存中,然后通过循环实现累加。但是我们不应该用mov命令把它们写到固定地址的内存单元中,最好的做法是让系统来为它们自动分配内存,就像我们并不会告诉系统我们的代码必须放在哪些内存单元中,而是系统在执行这段程序时动态分配。
既然这样,那么还有一个问题需要注意,那就是既然把为数据分配内存的任务交给了系统,那么我们怎么知道系统把这些数据安排在哪里了呢?也就是说当我们想要使用这些数据时,我们应该去哪块内存将其读取出来呢?
assume cs:codeseg
codeseg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;dw--定义字型数据:define word
mov ax,0 ;初始化结果值为零
mov bx,0 ;初始化偏移地址为零
mov cx,8 ;循环次数设为8
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
codeseg ends
end
我们需要在代码中指明程序的入口所在。
assume cs:codeseg
codeseg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;dw--定义字型数据:define word
start: mov ax,0 ;初始化结果值为零
mov bx,0 ;初始化偏移地址为零
mov cx,8 ;循环次数设为8
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
codeseg ends
end start ;end指令指明了程序的入口的地址在start标号处
实例2:利用栈,将下面的8个数据逆序存放
assume cs:codeseg
codeseg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;dw--定义字型数据:define word
dw 0,0,0,0,0,0,0,0 ;作为栈使用
start: mov ax,cs
mov ss,ax
mov sp,20h ;初始化栈的段地址和栈顶
mov bx,0 ;注意数据存放的初始位置在段首
mov cx,8
s: push cs:[bx] ;循环入栈
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop cs:[bx] ;循环出栈,则实现逆序
add bx,2
loop s0
mov ax,4c00h
int 21h
codeseg ends
end start
·实例3:下面将使用多段来完成前面的功能:数据、栈和代码段分开使用
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,10h ;初始化栈段空间:段地址、栈顶地址
mov ax,data
mov ds,ax ;初始化数据段空间:段地址、偏移地址
mov bx,0
mov cx,8
s: push [bx] ;循环入栈
add bx,2
loop s
mov bx,0
mov cx,8 ;循环出栈,则实现逆序
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start