汇编学习笔记--包含多个段的程序

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


注意:上述程序编译可以通过,但是当执行时会存在问题,因为程序的cs:ip指向的并不是我们希望的mov ax,0对应的地址,而是数据地址,其对应的具体指令如下:AND AX, [BX + DI]

我们需要在代码中指明程序的入口所在。


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


你可能感兴趣的:(汇编学习笔记--包含多个段的程序)