Skip to content

Latest commit

 

History

History
123 lines (96 loc) · 2.18 KB

6.包含多个段的程序.md

File metadata and controls

123 lines (96 loc) · 2.18 KB

王爽汇编第六章,包含多个段的程序

[toc]

多个段

我们之前所有的程序里,都只有一个代码段。那么现在问题来了,我们程序如果需要用到其他空间来存放数据怎么办呢?

比如:

  • 在一个段中存放数据、代码、栈。
  • 将数据、代码、栈放入不同的段中。

在代码段中使用数据

考虑这样一个问题,编程计算以下8个数据的和,结果存在ax寄存器中:

0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

assume cs:code

code segment ;define word定义8个字型数据
	dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:
	  mov bx,0 ;下标
	  mov cx,8
    s:mov dx, cs:[bx]
      add ax,dx
      add bx,2
      loop s
      
      ;return dos
      mov ax,4c00h
      int 21h
      
code ends
end start

在代码段中使用栈

利用栈,将程序中定义的数据逆序存放。

assume cs:code

code segment
	dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    dw 0000000000000000  ;作为栈使用
start:
      mov ax,cs ;将栈段寄存器设置cs上
      mov ss,ax
      mov sp,30h;设置栈顶ss:sp -> 到栈底 cs:48
    
      mov bx,0
      mov cx,8
    s:mov ax,cs:[bx]
      push ax
      add bx,2
      loop s
      
      mov cx,8
      mov bx,0
   s1:pop ax
      mov ss:[bx],ax
      add bx,2
      loop s1
      
      mov ax,4c00h
      int 21h
    
code ends
end start

将数据、代码、栈放入不同的段

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:
	  mov ax,data;关联ds段
	  mov ds,ax
	  mov ax,stack;关联ss段
	  mov ss,ax
	  mov sp,32 ;设置栈顶
	  
	  mov bx,0;下标 索引
	  mov cx,8;循环次数
	s:push [bx]
	  add bx,2
	  loop s
	  
	  mov bx,0
	  mov cx,8
   s1:pop [bx]
      add bx,2
      loop s1

      ;程序退出
      mov ax,4c00h
      int 21h
code ends
end start