您的位置:首页 > 编程语言

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

2014-02-12 14:52 453 查看
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,16    ;将设置栈顶ss:sp指向stack:16

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        ;将以上代码段0-16单元中的8个字符型数据依次入栈

mov bx,0
mov cx,8
s0:    pop [bx]
add bx,2
loop s0        ;以上依次出栈8个字符型数据到代码段0-16单元中

mov ax,4c00H
int 21h
code ends
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: