(2011.10.28)汇编_王爽_第六章_学习小结

时间:2023-01-14 01:16:07
 

(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