汇编网首页登录博客注册
girl_lulu的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  

[2010-08-08 22:29] 第6章 6.2  在代码段中使用栈(繁琐啊) 6.3 使用代码段 数据段 栈段(美观 简洁)

一 将程序段中的数据逆序存放(必须用栈,使用栈之前先开辟一段空间)
assume cs:code 
code segment
 dw 0123h,0456h,0789h,0abch,0defh,0321h,0654h,0987h
 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 
 start: mov ax,cs
        mov ss,ax
        mov sp,30
        
        mov bx,0
        mov cx,8
        s: push cs:[bx]
           add bx,2
           loop s
           
        mov bx,0
        mov cx,8
        s1: pop cs:[bx]
            add bx,2
            loop s1
        
 mov ax,4c00h
 int 21h
 code ends
 end start


  50610 + 450318 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors

C:\DOCUME~1\ADMINI~1>p8

C:\DOCUME~1\ADMINI~1>
C:\DOCUME~1\ADMINI~1>link

Microsoft (R) Overlay Linker  Version 3.60
Copyright (C) Microsoft Corp 1983-1987.  All rights reserved.

Object Modules [.OBJ]: p8
Run File [P8.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment

C:\DOCUME~1\ADMINI~1>
C:\DOCUME~1\ADMINI~1>debug p8.exe
-d cs:0 f    //系统执行后,用debug加载为何不显示执行结果???
0B73:0000  23 01 56 04 89 07 BC 0A-EF 0D 21 03 54 06 87 09   #.V.......!.T...
-


然后:
-u
0B73:0030 8CC8          MOV     AX,CS
0B73:0032 8ED0          MOV     SS,AX
0B73:0034 BC1E00        MOV     SP,001E
0B73:0037 BB0000        MOV     BX,0000
0B73:003A B90800        MOV     CX,0008
0B73:003D 2E            CS:
0B73:003E FF37          PUSH    [BX]
0B73:0040 83C302        ADD     BX,+02
0B73:0043 E2F8          LOOP    003D
0B73:0045 BB0000        MOV     BX,0000
0B73:0048 B90800        MOV     CX,0008
0B73:004B 2E            CS:
0B73:004C 8F07          POP     [BX]
0B73:004E 83C302        ADD     BX,+02
-g   //g命令执行时,到底有什么特点?(只能执行到具体某一步才能看到准确结果……)

Program terminated normally
-d cs:0 f
0B73:0000  87 09 54 06 21 03 13 3E-4F 03 00 00 00 00 00 00   ..T.!..>O.......
-


又:
DS=0B63  ES=0B63  SS=0B73  CS=0B73  IP=004E   NV UP EI PL NZ AC PO NC
0B73:004E 83C302        ADD     BX,+02
-u
0B73:004E 83C302        ADD     BX,+02
0B73:0051 E2F8          LOOP    004B
0B73:0053 B8004C        MOV     AX,4C00
0B73:0056 CD21          INT     21
0B73:0058 5E            POP     SI
0B73:0059 8B5E06        MOV     BX,[BP+06]
0B73:005C 26            ES:
0B73:005D 8B5F06        MOV     BX,[BX+06]
0B73:0060 D1E3          SHL     BX,1
0B73:0062 D1E3          SHL     BX,1
0B73:0064 8B368021      MOV     SI,[2180]
0B73:0068 8B00          MOV     AX,[BX+SI]
0B73:006A 8B5002        MOV     DX,[BX+SI+02]
0B73:006D 8946FA        MOV     [BP-06],AX
-g 53

AX=0B73  BX=0010  CX=0000  DX=0000  SP=001E  BP=0000  SI=0000  DI=0000
DS=0B63  ES=0B63  SS=0B73  CS=0B73  IP=0053   NV UP EI PL NZ AC PO NC
0B73:0053 B8004C        MOV     AX,4C00
-d cs:0 f
0B73:0000  87 09 54 06 21 03 EF 0D-BC 0A 89 07 56 04 23 01   ..T.!.......V.#.
-


注意:


【使用代码段 数据段 栈段改写(美观)】

assume cs:code,ds:data,ss:stack
data segment
 dw 0123h,0456h,0789h,0abch,0defh,0321h,0654h,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
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,20h
        
        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



二 将程序段中定义的数据改写(用内存中的数据改写)
assume cs:code
code segment
 dw 0123h,0456h,0789h,0abch,0defh,0321h,0654h,0987h

 start: mov ax,0
        mov ds,ax
        
        mov bx,0
        mov cx,8
        s: mov ax,[bx]
           mov cs:[bx],ax
           add bx,2
           loop s
        
 
 mov ax,4c00h
 int 21h
code ends
end start
 


C:\DOCUME~1\ADMINI~1>debug p9.exe
-d ds:0 f
0B63:0000  CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 73 05 8A 03   . ........O.s...
-d cs:0 f  //系统执行后,用debug加载为何不显示执行结果???
0B73:0000  23 01 56 04 89 07 BC 0A-EF 0D 21 03 54 06 87 09   #.V.......!.T...
-u
0B73:0010 B80000        MOV     AX,0000
0B73:0013 8ED8          MOV     DS,AX
0B73:0015 BB0000        MOV     BX,0000
0B73:0018 B90800        MOV     CX,0008
0B73:001B 8B07          MOV     AX,[BX]
0B73:001D 2E            CS:
0B73:001E 8907          MOV     [BX],AX
0B73:0020 83C302        ADD     BX,+02
0B73:0023 E2F6          LOOP    001B
0B73:0025 B8004C        MOV     AX,4C00
0B73:0028 CD21          INT     21
0B73:002A 46            INC     SI
0B73:002B F8            CLC
0B73:002C 26            ES:
0B73:002D 837F0600      CMP     WORD PTR [BX+06],+00
-g     //g命令执行时,有什么特点??(这里是不是连着把后面的指令都执行了……导致d命令查看时结果已变!!)

Program terminated normally
-

-d cs:0 f
0B73:0000  68 10 A7 00 BB 13 73 05-16 00 A3 03 B1 13 73 05   h.....s.......s.
-d ds:0 f
0B63:0000  CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 73 05 8A 03   . ........O.s...
-


又:

0B73:0010 B80000        MOV     AX,0000
0B73:0013 8ED8          MOV     DS,AX
0B73:0015 BB0000        MOV     BX,0000
0B73:0018 B90800        MOV     CX,0008
0B73:001B 8B07          MOV     AX,[BX]
0B73:001D 2E            CS:
0B73:001E 8907          MOV     [BX],AX
0B73:0020 83C302        ADD     BX,+02
0B73:0023 E2F6          LOOP    001B
0B73:0025 B8004C        MOV     AX,4C00
0B73:0028 CD21          INT     21
0B73:002A 46            INC     SI
0B73:002B F8            CLC
0B73:002C 26            ES:
0B73:002D 837F0600      CMP     WORD PTR [BX+06],+00
-g 25     //如果该页有其他指令,需执行到某一步(如25)!

AX=0573  BX=0010  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0000  ES=0B63  SS=0B73  CS=0B73  IP=0025   NV UP EI PL NZ AC PO NC
0B73:0025 B8004C        MOV     AX,4C00
-d cs:0 f
0B73:0000  68 10 A7 00 BB 13 73 05-16 00 A3 03 B1 13 73 05   h.....s.......s.
-d ds:0 f
0000:0000  68 10 A7 00 BB 13 73 05-16 00 A3 03 B1 13 73 05   h.....s.......s.
-

注:另一种方式,即使用栈传送数据:内存—>栈—>改写(麻烦!!)



   总结:1>
          g命令使用方法,即g 终止位置(类似d查看内存命令)
         2> 疑问:
          Ⅰ masm/link,然后执行(操作系统),这种执行情况下,用debug加载后为什么不能查看内存和寄存器结果的变化??
           Ⅱ debug p3.exe (加载运行).
评论次数(0)  |  浏览次数(377)  |  类型(汇编语言) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码