|
主题 : : 分析一个奇怪的程序遇到问题? [待解决] |
回复[ 34次 ]
点击[ 2462次 ] | |
|
|
|
|
[帖 主] [ 发表时间:2007-06-26 20:49 ] | |
荣誉值:5
信誉值:3
注册日期:2007-06-26 20:40 |
分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start | | |
|
|
|
|
[第19楼] [ 回复时间:2010-01-10 01:47 ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18 |
今天终于把实验做了一遍实验过程如下
C:\>debug32 c:\masm\qiguai.exe
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994
CPU = 686, Virtual 8086 Mode, Id/Step = 067A, A20 enabled
-r
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=2186 ES=2186 SS=2196 CS=2196 IP=0005 NV UP DI PL NZ NA PO NC
2196:0005 B80000 MOV AX,0000h
-u
2196:0008 90 NOP
2196:0009 90 NOP
2196:000A BF0800 MOV DI,0008h
2196:000D BE2000 MOV SI,0020h
2196:0010 2E8B04 MOV AX,CS:[SI]
2196:0013 2E8905 MOV CS:[DI],AX
2196:0016 EBF0 JMP Short 0008
2196:0018 B80000 MOV AX,0000h
2196:001B CD21 INT 21h
2196:001D B80000 MOV AX,0000h
2196:0020 EBF6 JMP Short 0018
2196:0022 90 NOP
-r
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=2186 ES=2186 SS=2196 CS=2196 IP=0005 NV UP DI PL NZ NA PO NC
2196:0005 B80000 MOV AX,0000h
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=2186 ES=2186 SS=2196 CS=2196 IP=0008 NV UP DI PL NZ NA PO NC
2196:0008 90 NOP
Trace Interrupt
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=2186 ES=2186 SS=2196 CS=2196 IP=0009 NV UP DI PL NZ NA PO NC
2196:0009 90 NOP
Trace Interrupt
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=2186 ES=2186 SS=2196 CS=2196 IP=000A NV UP DI PL NZ NA PO NC
2196:000A BF0800 MOV DI,0008h
Trace Interrupt
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0008
DS=2186 ES=2186 SS=2196 CS=2196 IP=000D NV UP DI PL NZ NA PO NC
2196:000D BE2000 MOV SI,0020h
Trace Interrupt
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=2186 ES=2186 SS=2196 CS=2196 IP=0010 NV UP DI PL NZ NA PO NC
2196:0010 2E8B04 MOV AX,CS:[SI]
Trace Interrupt
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=2186 ES=2186 SS=2196 CS=2196 IP=0013 NV UP DI PL NZ NA PO NC
2196:0013 2E8905 MOV CS:[DI],AX
Trace Interrupt
-u 2196:0
2196:0000 B8004C MOV AX,4C00h
2196:0003 CD21 INT 21h
2196:0005 B80000 MOV AX,0000h
2196:0008 90 NOP
2196:0009 90 NOP
2196:000A BF0800 MOV DI,0008h
2196:000D BE2000 MOV SI,0020h
2196:0010 2E8B04 MOV AX,CS:[SI]
2196:0013 2E8905 MOV CS:[DI],AX
2196:0016 EBF0 JMP Short 0008
2196:0018 B80000 MOV AX,0000h
2196:001B CD21 INT 21h
-r
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=2186 ES=2186 SS=2196 CS=2196 IP=0013 NV UP DI PL NZ NA PO NC
2196:0013 2E8905 MOV CS:[DI],AX
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=2186 ES=2186 SS=2196 CS=2196 IP=0016 NV UP DI PL NZ NA PO NC
2196:0016 EBF0 JMP Short 0008
Trace Interrupt
-u 2196:0
2196:0000 B8004C MOV AX,4C00h
2196:0003 CD21 INT 21h
2196:0005 B80000 MOV AX,0000h
2196:0008 EBF6 JMP Short 0000
2196:000A BF0800 MOV DI,0008h
2196:000D BE2000 MOV SI,0020h
2196:0010 2E8B04 MOV AX,CS:[SI]
2196:0013 2E8905 MOV CS:[DI],AX
2196:0016 EBF0 JMP Short 0008
2196:0018 B80000 MOV AX,0000h
2196:001B CD21 INT 21h
2196:001D B80000 MOV AX,0000h
-u
2196:0020 EBF6 JMP Short 0018
2196:0022 90 NOP
2196:0023 0000 ADD [BX+SI],AL
2196:0025 0000 ADD [BX+SI],AL
2196:0027 0000 ADD [BX+SI],AL
2196:0029 0000 ADD [BX+SI],AL
2196:002B 0000 ADD [BX+SI],AL
2196:002D 0000 ADD [BX+SI],AL
2196:002F 0000 ADD [BX+SI],AL
2196:0031 0000 ADD [BX+SI],AL
2196:0033 0000 ADD [BX+SI],AL
2196:0035 0000 ADD [BX+SI],AL
感觉最重要的地方是对EBF6的理解,其次是编译的问题,因为程序是要先经过编译再到cpu中运行,cup 并不执行编译的过程,我用的是masm5.0编译器 | | |
|