|
发表于 2013-6-17 04:59:54
|
显示全部楼层
本帖最后由 yearn2005 于 2013-6-17 06:30 编辑
10.5题目我也纠结了,虽然课本说不要在SEBUG中单布跟踪,不过跟踪下也没什么坏处啊。这个程序定义了 assume cs:code 但没定义ds ss. 运行到MOV DS,AX后 没CALL之前栈段里就有数据(红色的字)了哦,我在这里纠结了很久,后来发现栈段被同时定义为 ss ds 段后,貌似这里会存放机器码或标志(有大虾出来确定下不?要不可能要学到很后面才恍然大雾)。
F:\a>debug 105.exe
-r
AX=0000 BX=0000 CX=0029 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13D9 ES=13D9 SS=13E9 CS=13EA IP=0000 NV UP EI PL NZ NA PO NC
13EA:0000 B8E913 MOV AX,13E9
-u
13EA:0000 B8E913 MOV AX,13E9
13EA:0003 8ED0 MOV SS,AX
13EA:0005 BC1000 MOV SP,0010
13EA:0008 8ED8 MOV DS,AX
13EA:000A B80000 MOV AX,0000
13EA:000D FF160E00 CALL [000E]
13EA:0011 40 INC AX <---- 按字面分析call word ptr ds:[0eh] 就是把偏移地址PUSH进ss同时SP指向SP-2=oeh
13EA:0012 40 INC AX 位置,然后JMP ds:[0eh] ds ss被设置为同一个段=jmp ss:[0eh]=jmp cs:0011
13EA:0013 40 INC AX 所以按字面分析最终AX=3
13EA:0014 B8004C MOV AX,4C00
13EA:0017 CD21 INT 21
13EA:0019 0000 ADD [BX+SI],AL
13EA:001B 0000 ADD [BX+SI],AL
-d ss:0
13E9:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13E9:0010 B8 E9
-t
AX=13E9 BX=0000 CX=0029 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13D9 ES=13D9 SS=13E9 CS=13EA IP=0003 NV UP EI PL NZ NA PO NC
13EA:0003 8ED0 MOV SS,AX
-d ss:0
13E9:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13E9:0010 B8 E9
-t
AX=13E9 BX=0000 CX=0029 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=13D9 ES=13D9 SS=13E9 CS=13EA IP=0008 NV UP EI PL NZ NA PO NC
13EA:0008 8ED8 MOV DS,AX
-d ss:0
13E9:0000 00 00 00 00 00 00 E9 13-00 00 08 00 EA 13 EB 0D ................ <--还没PUSH哦,段里被写进数据
13E9:0010 B8 E9 《----未PUSH进数据,sp指向这里10h [b8 e9]
|
|