我对程序的每一步的分析:
d:\asm>debug lab8.exe
-r
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0005 NV UP EI PL NZ NA PO NC
14D9:0005 B80000 MOV AX,0000
;程序入口为14D9:0005, 因为在程序的前面有两行代码,
mov ax,4c00h
int 21h
这两行代码占5字节, 故第一条指令地址为cs:0005,CX为代码长度, IP为0005
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0008 NV UP EI PL NZ NA PO NC
14D9:0008 90 NOP
;标记S,产生两字节空间,IP为0008
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0009 NV UP EI PL NZ NA PO NC
14D9:0009 90 NOP
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=000A NV UP EI PL NZ NA PO NC
14D9:000A BF0800 MOV DI,0008
;mov di,offset s
;将标记S的偏移地址装入目的地址存贮器,标记S的偏移地址为0008, IP为000A
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0008
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=000D NV UP EI PL NZ NA PO NC
14D9:000D BE2000 MOV SI,0020
;mov si,offset s2
;將标记S2所指示代码偏移地址装入源地址存贮器。IP为000D
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0010 NV UP EI PL NZ NA PO NC
14D9:0010 2E CS:
14D9:0011 8B04 MOV AX,[SI] CS:0020=F6EB
;將内存单元[20h]处数据(F6EB)装入AX寄存, IP为0010
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0013 NV UP EI PL NZ NA PO NC
14D9:0013 2E CS:
14D9:0014 8905 MOV [DI],AX CS:0008=9090
;將寄存在AX中的数据转存至内存单元以DI作为变量的[0008]中。IP为0016
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0016 NV UP EI PL NZ NA PO NC
14D9:0016 EBF0 JMP 0008
;jmp short S,准备段内跳转,由于是站内短转移, CS值不变, IP变为0008
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0008 NV UP EI PL NZ NA PO NC
14D9:0008 EBF6 JMP 0000
;此时IP0008处即将执行的代码为:EBF6,对应代码jmp, 地址为0000, 也即
;即将执行的指令位于cs:0000处
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0000 NV UP EI PL NZ NA PO NC
14D9:0000 B8004C MOV AX,4C00
;调用dos 4c号中断功能
-t
AX=4C00 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=14C9 ES=14C9 SS=14D9 CS=14D9 IP=0003 NV UP EI PL NZ NA PO NC
14D9:0003 CD21 INT 21
-p
;完成程序正确退出。
Program terminated normally
-
=======================================================================
这是我的粗浅的理解。 跳来跳去的让人无奈~~, 还是希望老师们给个标准的答案吧。 |