汇编学习笔记--包含多个段的程序
2013-04-14 16:46
260 查看
实例1:计算如下八个数的和,结果存放在ax中 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
分析:
可以将这八个数存放在内存中,然后通过循环实现累加。但是我们不应该用mov命令把它们写到固定地址的内存单元中,最好的做法是让系统来为它们自动分配内存,就像我们并不会告诉系统我们的代码必须放在哪些内存单元中,而是系统在执行这段程序时动态分配。
既然这样,那么还有一个问题需要注意,那就是既然把为数据分配内存的任务交给了系统,那么我们怎么知道系统把这些数据安排在哪里了呢?也就是说当我们想要使用这些数据时,我们应该去哪块内存将其读取出来呢?
注意:上述程序编译可以通过,但是当执行时会存在问题,因为程序的cs:ip指向的并不是我们希望的mov ax,0对应的地址,而是数据地址,其对应的具体指令如下:AND AX, [BX + DI]
我们需要在代码中指明程序的入口所在。
实例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
分析:
可以将这八个数存放在内存中,然后通过循环实现累加。但是我们不应该用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
相关文章推荐
- 汇编入门学习笔记 (五)—— 包含多个段的程序
- 汇编语言学习笔记(6)——包含多个段的程序
- [汇编学习笔记][第六章包含多个段的程序]
- [置顶] [汇编学习笔记][第六章包含多个段的程序]
- 汇编语言学习笔记(六)包含多个段的程序
- [汇编语言学习笔记][第四章第一个程序的编写]
- 【学习笔记】6.包含多个段的程序
- [置顶] [汇编语言学习笔记][第四章第一个程序的编写]
- 32位汇编语言学习笔记(34)--一个数据的柱状图显示程序
- 包含多个段的程序03 - 零基础入门学习汇编语言31
- windows下32位汇编语言学习笔记 第四章 第一个窗口程序 (windows的消息机制)
- 汇编学习笔记-实验5 编写,调试具有多个段的程序[1]
- 32位汇编语言学习笔记(28)--一个简单的光标控制程序
- 包含多个段的程序03 - 零基础入门学习汇编语言31
- windows下32位汇编语言学习笔记 第四章 第一个窗口程序 1 (消息的使用和入口代码)
- 王爽《汇编语言》(第二版) 学习笔记 (第六章 包含多个段的程序 )
- 32位汇编语言学习笔记(23)--大小写转换程序2
- 32位汇编语言学习笔记(24)--HexDump程序
- 汇编语言学习--包含多段的程序
- 包含多个段的程序01 - 零基础入门学习汇编语言29