一 将程序段中的数据逆序存放(必须用栈,使用栈之前先开辟一段空间)
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 (加载运行).
[2010-08-08 22:29] 第6章 6.2 在代码段中使用栈(繁琐啊) 6.3 使用代码段 数据段 栈段(美观 简洁)
评论次数(0) |
浏览次数(377) |
类型(汇编语言) |
收藏此文 |