您的位置:首页 > 其它

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

2013-04-14 16:46 260 查看
实例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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: