栈空间

Tutorial: 汇编基础 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0

栈段数据段代码段

  1. 通过栈空间将 0123H,4567H,89ABH,0CDEFH 逆序排放
ASSUME CS:code

code SEGMENT
	         DW   0123H,1234H,2345H,3456H,4567H,5678H,6789H,789AH
	         DW   0,0,0,0,0,0,0,0                                	; 模拟申请的栈空间
	         DW   0,0,0,0,0,0,0,0                                	; 模拟申请的栈空间

	start:
	         mov  ax, cs
	         mov  ss, ax                                         	; 段地址
	         mov  sp, 30H                                        	; 栈顶

	         mov  ax, cs
	         mov  ds,ax                                          	; 数据从哪里来

	         mov  bx,0                                           	; 累加
	         mov  cx,8                                           	; 循环8次

	pushData:push ds:[bx]                                        	; 放到栈中
	         add  bx,2
	         loop pushData

	         mov  bx,0                                           	; 还原
	         mov  cx,8                                           	; 还原

	popData: pop  ds:[bx]                                        	; 弹出顶层字放到 ds:[bx] 的地址段中
	         add  bx,2
	         loop popData

	         mov  ax,4C00H
	         int  21h
code ENDS

END start
r
AX=0000  BX=0000  CX=005A  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0E14  ES=0E14  SS=0E23  CS=0E24  IP=0030   NV UP EI PL NZ NA PO NC
0E24:0030 8CC8          mov     AX,CS
-d cs:0 2F
0E24:0000  23 01 34 12 45 23 56 34-67 45 78 56 89 67 9A 78   #.4.E#V4gExV.g.x
0E24:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0E24:0020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
-u
0E24:0030 8CC8          mov     AX,CS
0E24:0032 8ED0          mov     SS,AX
0E24:0034 BC3000        mov     SP,0030
0E24:0037 8CC8          mov     AX,CS
0E24:0039 8ED8          mov     DS,AX
0E24:003B BB0000        mov     BX,0000
0E24:003E B90800        mov     CX,0008
0E24:0041 FF37          push    [BX]
0E24:0043 83C302        add     BX,+02
0E24:0046 E2F9          loop    0041
0E24:0048 BB0000        mov     BX,0000
0E24:004B B90800        mov     CX,0008
0E24:004E 8F07          pop     [BX]
-g 41

AX=0E24  BX=0000  CX=0008  DX=0000  SP=0030  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=0041   NV UP EI PL NZ NA PO NC
0E24:0041 FF37          push    [BX]                               DS:0000=0123
-t

AX=0E24  BX=0000  CX=0008  DX=0000  SP=002E  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=0043   NV UP EI PL NZ NA PO NC
0E24:0043 83C302        add     BX,+02
-d cs:0 2F
0E24:0000  23 01 34 12 45 23 56 34-67 45 78 56 89 67 9A 78   #.4.E#V4gExV.g.x
0E24:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0E24:0020  00 00 00 00 24 0E 00 00-43 00 24 0E 21 08 23 01   ....$...C.$.!.#.
-t

AX=0E24  BX=0002  CX=0008  DX=0000  SP=002E  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=0046   NV UP EI PL NZ NA PO NC
0E24:0046 E2F9          loop    0041
-p

AX=0E24  BX=0010  CX=0000  DX=0000  SP=0020  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=0048   NV UP EI PL NZ AC PO NC
0E24:0048 BB0000        mov     BX,0000
-d cs:0 2F
0E24:0000  23 01 34 12 45 23 56 34-67 45 78 56 89 67 9A 78   #.4.E#V4gExV.g.x
0E24:0010  00 00 00 00 00 00 00 00-00 00 48 00 24 0E 21 08   ..........H.$.!.
0E24:0020  9A 78 89 67 78 56 67 45-56 34 45 23 34 12 23 01   .x.gxVgEV4E#4.#.

# 弹出
-r
AX=0E24  BX=0010  CX=0000  DX=0000  SP=0020  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=0048   NV UP EI PL NZ AC PO NC
0E24:0048 BB0000        mov     BX,0000
-t

AX=0E24  BX=0000  CX=0000  DX=0000  SP=0020  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=004B   NV UP EI PL NZ AC PO NC
0E24:004B B90800        mov     CX,0008
-t

AX=0E24  BX=0000  CX=0008  DX=0000  SP=0020  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=004E   NV UP EI PL NZ AC PO NC
0E24:004E 8F07          pop     [BX]                               DS:0000=0123
-t

AX=0E24  BX=0000  CX=0008  DX=0000  SP=0022  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=0050   NV UP EI PL NZ AC PO NC
0E24:0050 83C302        add     BX,+02
-d cs:0 2F
0E24:0000  9A 78 34 12 45 23 56 34-67 45 78 56 89 67 9A 78   .x4.E#V4gExV.g.x
0E24:0010  00 00 00 00 00 00 24 0E-24 0E 00 00 50 00 24 0E   ......$.$...P.$.
0E24:0020  21 08 89 67 78 56 67 45-56 34 45 23 34 12 23 01   !..gxVgEV4E#4.#.
-t

AX=0E24  BX=0002  CX=0008  DX=0000  SP=0022  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=0053   NV UP EI PL NZ NA PO NC
0E24:0053 E2F9          loop    004E
-p

AX=0E24  BX=0010  CX=0000  DX=0000  SP=0030  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E24  CS=0E24  IP=0055   NV UP EI PL NZ AC PO NC
0E24:0055 B8004C        mov     AX,4C00
-d cs:0 2F
0E24:0000  9A 78 89 67 78 56 67 45-56 34 45 23 34 12 23 01   .x.gxVgEV4E#4.#.
0E24:0010  00 00 00 00 00 00 24 0E-24 0E 00 00 53 00 24 0E   ......$.$...S.$.
0E24:0020  02 72 89 67 78 56 67 45-00 00 55 00 24 0E 21 08   .r.gxVgE..U.$.!.
  1. 栈段数据段代码段
ASSUME CS:code,DS:data,SS:stack

; 数据段
data SEGMENT
	     DW 0123H,1234H,2345H,3456H,4567H,5678H,6789H,789AH
data ENDS

; 栈段
stack SEGMENT stack     		; 注意这里再写一次 stack
	      DW 0,0,0,0,0,0,0,0
	      DW 0,0,0,0,0,0,0,0
stack ENDS

; 代码段
code SEGMENT
	start:
	; 关联栈段
	         mov  ax, stack
	         mov  ss,ax
	         mov  sp, 16   	; 16个字节

	; 关联数据段
	         mov  ax, data
	         mov  ds, ax

	; 测试代码
	         mov  bx,0
	         mov  cx,8

	; 入栈
	; sp-2
	copyData:push ds:[bx]
	         add  bx,2     	; 注意这里 +2
	         loop copyData

	; 退出
	         mov  ax,4C00H
	         int  21h
code ENDS

END start
-u
0E27:0000 B8250E        mov     AX,0E25
0E27:0003 8ED0          mov     SS,AX
0E27:0005 BC1000        mov     SP,0010
0E27:0008 B8240E        mov     AX,0E24
0E27:000B 8ED8          mov     DS,AX
0E27:000D BB0000        mov     BX,0000
0E27:0010 B90800        mov     CX,0008
0E27:0013 FF37          push    [BX]
0E27:0015 83C302        add     BX,+02
0E27:0018 E2F9          loop    0013
0E27:001A B8004C        mov     AX,4C00
0E27:001D CD21          int     21
-g 13

AX=0E24  BX=0000  CX=0008  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E25  CS=0E27  IP=0013   NV UP EI PL NZ NA PO NC
0E27:0013 FF37          push    [BX]                               DS:0000=0123
-d ds:0 F
0E24:0000  23 01 34 12 45 23 56 34-67 45 78 56 89 67 9A 78   #.4.E#V4gExV.g.x
-d ss:0 2F
0E25:0000  00 00 00 00 00 00 00 00-00 00 13 00 27 0E 21 08   ............'.!.
0E25:0010  00 00 00 00 00 00 00 00-00 00 00 00 27 0E 02 F2   ............'...
0E25:0020  B8 25 0E 8E D0 BC 10 00-B8 24 0E 8E D8 BB 00 00   .%.......$......
-t

AX=0E24  BX=0000  CX=0008  DX=0000  SP=000E  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E25  CS=0E27  IP=0015   NV UP EI PL NZ NA PO NC
0E27:0015 83C302        add     BX,+02
-d ss:0 2F
0E25:0000  00 00 00 00 24 0E 00 00-15 00 27 0E 21 08 23 01   ....$.....'.!.#.
0E25:0010  00 00 00 00 00 00 00 00-00 00 00 00 27 0E 02 F2   ............'...
0E25:0020  B8 25 0E 8E D0 BC 10 00-B8 24 0E 8E D8 BB 00 00   .%.......$......
-t

AX=0E24  BX=0002  CX=0008  DX=0000  SP=000E  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E25  CS=0E27  IP=0018   NV UP EI PL NZ NA PO NC
0E27:0018 E2F9          loop    0013
-p

AX=0E24  BX=0010  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E25  CS=0E27  IP=001A   NV UP EI PL NZ AC PO NC
0E27:001A B8004C        mov     AX,4C00
-d ss:0 2F
0E25:0000  9A 78 89 67 78 56 67 45-56 34 45 23 34 12 23 01   .x.gxVgEV4E#4.#.
0E25:0010  00 00 00 00 00 00 00 00-00 00 00 00 27 0E 02 F2   ............'...
0E25:0020  B8 25 0E 8E D0 BC 10 00-B8 24 0E 8E D8 BB 00 00   .%.......$......
  1. 观察调试
ASSUME CS:code,DS:data,SS:stack

data SEGMENT
             DW 0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
data ENDS

stack SEGMENT stack
              DW 0,0,0,0,0,0,0,0
stack ENDS

code SEGMENT
        start:
              mov  ax,stack
              mov  ss,ax
              mov  sp,16

              mov  ax,data
              mov  ds,ax

              push ds:[0]
              push ds:[2]
              pop  ds:[2]
              pop  ds:[0]

              mov  ax,4C00H
              int  21H

code ENDS
END start
-r
AX=0E24  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E25  CS=0E26  IP=001D   NV UP EI PL NZ NA PO NC
0E26:001D B8004C        mov     AX,4C00
-d ds:0
// 数据段
0E24:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09   #.V.............
// 栈段
0E24:0010  00 00 24 0E 24 0E 24 0E-00 00 1D 00 26 0E 21 08   ..$.$.$.....&.!.
// 代码段
0E24:0020  B8 25 0E 8E D0 BC 10 00-B8 24 0E 8E D8 FF 36 00   .%.......$....6.
0E24:0030  00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
0E24:0040  CD 21 00 26 8F 06 78 13-60 1E 26 8B 36 3A 00 26   .!.&..x.`.&.6:.&
0E24:0050  8E 1E 3C 00 8A 14 32 F6-8B 44 01 26 A3 82 13 03   ..<...2..D.&....
0E24:0060  D2 26 8B 3E 4E 13 8C D8-83 FF 00 74 1D 8E DF 8B   .&.>N......t....
0E24:0070  36 04 00 8B 3E 00 00 03-F6 74 ED 8B 5C 0E E8 12   6...>....t..\...
-u 0E24:20
0E24:0020 B8250E        mov     AX,0E25
0E24:0023 8ED0          mov     SS,AX
0E24:0025 BC1000        mov     SP,0010
0E24:0028 B8240E        mov     AX,0E24
0E24:002B 8ED8          mov     DS,AX
0E24:002D FF360000      push    [0000]
0E24:0031 FF360200      push    [0002]
0E24:0035 8F060200      pop     [0002]
0E24:0039 8F060000      pop     [0000]
0E24:003D B8004C        mov     AX,4C00
-d ss:0 F
0E25:0000  00 00 24 0E 24 0E 24 0E-00 00 1D 00 26 0E 21 08   ..$.$.$.....&.!.
-d cs:0 F
0E26:0000  B8 25 0E 8E D0 BC 10 00-B8 24 0E 8E D8 FF 36 00   .%.......$....6.

// DS=0E24
// SS=0E25
// CS=0E26
// 0E24H * 10H + 0010H = 0E25H
// 0E24H * 10H + 0020H = 0E26H
// 如果 code的段地址为x, 则 data 的段地址为 x -2(H), stack的段地址是 x-1(H)
  1. 段补满
  • 如果段中的数据占用 N 个字节,则程序加载后,该段实际占用空间为 (N/16 + 1)*16 个字节(只他们的商)
ASSUME CS:code,DS:data,SS:stack

data SEGMENT
             DW 0EEH,0EEH
data ENDS

stack SEGMENT stack
              DW 0FFH,0FFH
stack ENDS

code SEGMENT
        start:
              mov  ax,stack
              mov  ss,ax
              mov  sp,16

              mov  ax,data
              mov  ds,ax

              push ds:[0]
              push ds:[2]
              pop  ds:[2]
              pop  ds:[0]

              mov  ax,4C00H
              int  21H

code ENDS
END start
-u
0E26:0000 B8250E        mov     AX,0E25
0E26:0003 8ED0          mov     SS,AX
0E26:0005 BC1000        mov     SP,0010
0E26:0008 B8240E        mov     AX,0E24
0E26:000B 8ED8          mov     DS,AX
0E26:000D FF360000      push    [0000]
0E26:0011 FF360200      push    [0002]
0E26:0015 8F060200      pop     [0002]
0E26:0019 8F060000      pop     [0000]
0E26:001D B8004C        mov     AX,4C00
-r
AX=0000  BX=0000  CX=0042  DX=0000  SP=0004  BP=0000  SI=0000  DI=0000
DS=0E14  ES=0E14  SS=0E25  CS=0E26  IP=0000   NV UP EI PL NZ NA PO NC
0E26:0000 B8250E        mov     AX,0E25
-d 0E25:0
0E25:0000  FF 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0E25:0010  B8 25 0E 8E D0 BC 10 00-B8 24 0E 8E D8 FF 36 00   .%.......$....6.
0E25:0020  00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
0E25:0030  CD 21 00 26 8F 06 78 13-60 1E 26 8B 36 3A 00 26   .!.&..x.`.&.6:.&
0E25:0040  8E 1E 3C 00 8A 14 32 F6-8B 44 01 26 A3 82 13 03   ..<...2..D.&....
0E25:0050  D2 26 8B 3E 4E 13 8C D8-83 FF 00 74 1D 8E DF 8B   .&.>N......t....
0E25:0060  36 04 00 8B 3E 00 00 03-F6 74 ED 8B 5C 0E E8 12   6...>....t..\...
0E25:0070  0B 73 07 83 EE 02 75 F3-EB DE 8B DA 03 1E 06 00   .s....u.........
-d 0E24:0
// (4/16 + 1)*16 = (0(商) + 1) * 16 = 16
0E24:0000  EE 00 EE 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0E24:0010  FF 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0E24:0020  B8 25 0E 8E D0 BC 10 00-B8 24 0E 8E D8 FF 36 00   .%.......$....6.
0E24:0030  00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
0E24:0040  CD 21 00 26 8F 06 78 13-60 1E 26 8B 36 3A 00 26   .!.&..x.`.&.6:.&
0E24:0050  8E 1E 3C 00 8A 14 32 F6-8B 44 01 26 A3 82 13 03   ..<...2..D.&....
0E24:0060  D2 26 8B 3E 4E 13 8C D8-83 FF 00 74 1D 8E DF 8B   .&.>N......t....
0E24:0070  36 04 00 8B 3E 00 00 03-F6 74 ED 8B 5C 0E E8 12   6...>....t..\...
如果 DW 0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H,0654H
-u
0E27:0000 B8260E        mov     AX,0E26
0E27:0003 8ED0          mov     SS,AX
0E27:0005 BC1000        mov     SP,0010
0E27:0008 B8240E        mov     AX,0E24
0E27:000B 8ED8          mov     DS,AX
0E27:000D FF360000      push    [0000]
0E27:0011 FF360200      push    [0002]
0E27:0015 8F060200      pop     [0002]
0E27:0019 8F060000      pop     [0000]
0E27:001D B8004C        mov     AX,4C00
-d 0E24:0
// (18/16 + 1)*16 = (1(商) + 1) * 16 = 32
0E24:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09   #.V.............
0E24:0010  54 06 00 00 00 00 00 00-00 00 00 00 00 00 00 00   T...............
0E24:0020  FF 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0E24:0030  B8 26 0E 8E D0 BC 10 00-B8 24 0E 8E D8 FF 36 00   .&.......$....6.
0E24:0040  00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   ..6............L
0E24:0050  CD 21 3C 00 8A 14 32 F6-8B 44 01 26 A3 82 13 03   .!<...2..D.&....
0E24:0060  D2 26 8B 3E 4E 13 8C D8-83 FF 00 74 1D 8E DF 8B   .&.>N......t....
0E24:0070  36 04 00 8B 3E 00 00 03-F6 74 ED 8B 5C 0E E8 12   6...>....t..\...
-u 0E24:30
0E24:0030 B8260E        mov     AX,0E26
0E24:0033 8ED0          mov     SS,AX
0E24:0035 BC1000        mov     SP,0010
0E24:0038 B8240E        mov     AX,0E24
0E24:003B 8ED8          mov     DS,AX
0E24:003D FF360000      push    [0000]
0E24:0041 FF360200      push    [0002]
0E24:0045 8F060200      pop     [0002]
0E24:0049 8F060000      pop     [0000]
0E24:004D B8004C        mov     AX,4C00
  1. 定义DB
ASSUME CS:code

a SEGMENT
          DB 1,2,3,4,5,6,7,8
a ENDS

b SEGMENT
          DB 1,2,3,4,5,6,7,8
b ENDS

code SEGMENT
        start:
              mov ax,a
              mov ds,ax

              mov ax,4C00H
              int 21H

code ENDS
END start
-r
AX=0E24  BX=0000  CX=002A  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E23  CS=0E26  IP=0005   NV UP EI PL NZ NA PO NC
0E26:0005 B8004C        mov     AX,4C00
-d ds:0
0E24:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
0E24:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
0E24:0020  B8 24 0E 8E D8 B8 00 4C-CD 21 6D 06 58 00 06 2E   .$.....L.!m.X...
0E24:0030  8E 06 00 00 26 8F 06 7E-13 26 8F 06 3A 00 26 8F   ....&..~.&..:.&.
0E24:0040  06 3C 00 26 8F 06 78 13-60 1E 26 8B 36 3A 00 26   .<.&..x.`.&.6:.&
0E24:0050  8E 1E 3C 00 8A 14 32 F6-8B 44 01 26 A3 82 13 03   ..<...2..D.&....
0E24:0060  D2 26 8B 3E 4E 13 8C D8-83 FF 00 74 1D 8E DF 8B   .&.>N......t....
0E24:0070  36 04 00 8B 3E 00 00 03-F6 74 ED 8B 5C 0E E8 12   6...>....t..\...
  1. 用push将a中的前8个字型数据逆序放到b中
ASSUME CS:code
a SEGMENT
          DW 1,2,3,4,5,6,7,8,9,0AH,0BH,0CH,0DH,0EH,0FH,0FFH
a ENDS

b SEGMENT
          DW 0,0,0,0,0,0,0,0
b ENDS

code SEGMENT
        start:  
                mov  ax,a
                mov  ds,ax
                mov  ax,b
                mov  ss,ax

                mov  sp,10H
                mov  cx,8
                mov  bx,0

        moveNum:push ds:[bx]
                add  bx,2
                loop moveNum

                mov  ax,4C00H
                int  21H

code ENDS
END start
Prev: 汇编程序 Next: AndOr