(2011.10.28)汇编_王爽_第六章_学习小结
本章主要内容:
1. 学会如何定义程序入口;
2. 知道如何定义多个段;
3. 知道如何运用所定义的多个段。
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:603_start_指明程序入口.asm
; 程序功能:将指定区域的数据放入栈并将数据按逆序存放到某区域中
assume cs:codesg
; 用dw定义16个字型数据,在程序加载后,将取得16个字的内存空间,存放这16个数据。
; 在后面的程序中将这段空间当作栈来使用
codesg segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
; dw即“define word“,每个dw数据占了16个字节的空间.
start:
mov ax, cs
mov ss, ax
mov sp, 30h ; 将设置栈顶ss:sp指向cs:30h[注意:这里是十六进制]
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 ; 以上依次出栈8个字型数据代码段0~15单元中
mov ax, 4c00h
int 21h
codesg ends
end start ; 指明程序的入口在start处[即将start:那里的地址设为cs:ip的地址]
; (end后加标号代表入口地址,标号可任意取,此时标号为start)
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:604_定义不同的段.asm
; 程序功能: 定义多个段,并将数据按逆序存放到某区域中
; 附: 一个段有8个字节,连续定义的段,连续存储
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, 0, 0, 0, 0, 0, 0, 0, 0
stack ends
; 开始定义代码段
code segment
start: ; 设置代码开始执行的入口地址
; ss:sp 栈段
mov ax, stack ; 将stack段的段地址送入ax中
mov ss, ax
mov sp, 20h ; 设置栈顶ss:sp指向stack:20
mov ax, data
mov ds, ax ; ds指向data段
mov bx, 0 ; ds:bx指向data段中的第一个单元
mov cx, 8
s:
push [bx]
add bx, 2
loop s ; 以上将data段中的0~15单元中的8个字型数据依次入栈
mov bx, 0
mov cx, 8
s0:
pop [bx]
add bx, 2
loop s0 ; 以上依次出栈8个字型数据到data段的0~15单元中
mov ax, 4c00h ; 程序返回
int 21h
code ends
end start
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:实验5_习题5_不同段中数据相加.asm
; 程序功能:将a段和b段中的数据依次相加,将结果存入到c段中
; 程序分析:
assume cs:code, ds:a, ds:b, ds:c
a segment
db 1, 2, 3, 4, 5, 6, 7, 8
a ends
b segment
db 1, 2, 3, 4, 5, 6, 7, 8
b ends
c segment
db 0, 0, 0, 0, 0, 0, 0, 0
c ends
code segment
start:
mov bx, 0
mov cx, 8
s:
mov ax, 0 ; 将a段的第bx个数据放入al中
mov dx, a
mov es, dx
mov al, es:[bx] ; 将b段的第bx个数据与al相加
mov dx, b
mov es, dx
add al, es:[bx]
mov dx, c ; 将相加结果放入c段中
mov es, dx
mov es:[bx], al
add bx, 2 ; 地址递增,开始循环
loop s
mov ax, 4c00h
int 21h
code ends
end start