|
发表于 2012-3-3 18:13:50
|
显示全部楼层
本帖最后由 莫名其妙 于 2012-3-3 18:15 编辑
昨天回答了一个这样的问题 给解答拉过来你看看
首先程序代码段开始的地方 是 cs:ip → cs:0000
但是程序的第一条指令不一定就是在 cs:0000 这点一定要明白!~
(当然你会见到这样的例题 比如 mov ax,4c00h int 21h在代码段开始的地方 在程序执行的第一条指令之前)
start: mov ax, data ; 这道题里 start : 的地方就是程序的第一条指令
mov ds, ax
;0B86:0000 78 56 34 12 00 00 00 00-00 00 00 00 00 00 00 00 这进行 data 数据进段后 内存单元中数据的存放(当然你机器上的段地址 和代码段地址数据可能跟我不一样)
mov bx, 0
;AX=0B86 BX=0000 CX=0026 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
;DS=0B86 ES=0B76 SS=0B86 CS=0B87 IP=000A NV UP EI PL NZ NA PO NC 这是BX等于0以后 各寄存器和个段地址的数据
( ip )
mov [bx], (BX ) ; 因为题目要求跳转后转到代码段开始的地方意思就是跳转到 CS : 0000 处 所以ds:[bx],bx 要等于0
;0B86:0000 00 00 34 12 00 00 00 00-00 00 00 00 00 00 00 00 这是执行 bx=0后内存中数据的存放
mov [bx+2], ( CS )
;0B86:0000 00 00 87 0B 00 00 00 00-00 00 00 00 00 00 00 00 看 内存数据的存放, 注意 87 0B 就是我的机器上当前CS段地址的值
jmp dword ptr ds:[0]
dword ptr ds:[0] 这里是从ds段 0号偏移地址开始的 取两个字形数据
jmp dword ptr ds:[0] 这句话的意思是 取两个字形数据 低字做IP 高字做CS 然后跳转过去 在书本p182页 9.6节写的还是比较清楚的
|
|