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