[汇编语言]-第六章 包含多个段的程序 将数据,代码,栈放入不同的段

 

 1 assume cs:code,ds:data,ss:stack
 2 data segment
 3     dw    0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
 4 data ends
 5 stack segment
 6     dw    0,0,0,0,0,0,0,0
 7 stack ends
 8 code segment    
 9 start:    mov ax,stack
10         mov ss,ax
11         mov sp,16    ;将设置栈顶ss:sp指向stack:16
12         
13         mov ax,data
14         mov ds,ax    ;ds指向data 
15         
16         mov bx,0    ;ds:bx指向data段中第一个单元
17         mov cx,8
18     s:    push [bx]
19         add bx,2
20         loop s        ;将以上代码段0-16单元中的8个字符型数据依次入栈
21         
22         mov bx,0
23         mov cx,8
24     s0:    pop [bx]
25         add bx,2
26         loop s0        ;以上依次出栈8个字符型数据到代码段0-16单元中
27         
28         mov ax,4c00H
29         int 21h
30 code ends
31 end start            ;指名程序的入口在start处

1- 程序中有多个段,如何访问段中数据? 通过地址,段地址:偏移地址

  在程序中段名就相当于一个段号,它代表了段地址.

  mov ax,data //将名称为data的段地址送入ax

 

2- Debug运行程序后 cx = 0050 表示整个code段为 50Byte 

段地址+1 表示偏移地址+16

0B60-0B61中间有0-F个字节

想要存储50Byte的字节程序,需要50/16=3表示段地址+3

code起始段地址为0B60则存储完代码后的段地址为0B62,如在接data段,则data段的段地址起始为0B63

 

3-如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为((N+15)/16)*16

N分为被16整除和不被16整除。

当N被16整除时: 占有的空间为(N/16)*16

当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。

两种情况总结成一个通用的公式:((N+15)/16)*16

 

 

posted @ 2014-02-12 14:52  galoishelley  阅读(629)  评论(0编辑  收藏  举报