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

本文介绍了一个使用8086汇编语言进行栈操作的具体例子,包括如何将数据段中的数据压入栈及弹出,并讨论了程序段的大小计算方式以及段在内存中的布局。

 

 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

 

 

转载于:https://www.cnblogs.com/galoishelley/p/3545951.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值