实例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