做我自己 发表于 2012-3-9 12:55:02

汇编的小问题

修改指令段和偏移地址直接JUP CS IP 就行了。。但是单独修改IP的时候为啥要通过JUP AX来修改呢。。不是更麻烦吗?为啥直接修改不行呢?

arkhe 发表于 2012-3-9 12:55:03

本帖最后由 arkhe 于 2012-3-9 18:00 编辑

jmp Segment:Offset可以,
王爽的汇编语言说的是:可以通过合法的寄存器来赋值。
在debug中,直接jmp offset也是完全可以的。。。

实际上ip的跳转是通过相对当前位置的向量来实现,并非一个具体的offset地址,
所以呢。。。。写程序的时候不要直接jmp offset,
debug中可以,是因为知道具体的地址,但是dos加载程序的时候,你就不知道具体地址了。


心如死结 发表于 2012-3-9 13:51:37

我也才学几天,但基础知识中,写明了..段地址不可以直接写入,必须用寄存器代入....
也就是开头学的
mov ax,1
mov es,ax
这样的...:loveliness:
不知道自己说的对不对,但应该是这样的......

做我自己 发表于 2012-3-9 14:07:25

但是修改CS 和IP的时候不是可以JUP CS IP吗?修改IP 的时候为啥要用AX来放IP。比如不可以JUP IP 吗?而是要MOV AX 16然后再JUP IP。。

1020232499 发表于 2012-3-9 16:08:12

本帖最后由 1020232499 于 2012-3-9 16:09 编辑

ax只是代表一个代码段的偏移地址
相当于cs:【ax】
直接修改ip不是更麻烦
mov ip,0000
jup ip

莫名其妙 发表于 2012-3-9 18:07:04

首先 是 JMP noJUP   
然后   jmp ip 这个IP你填写的是数据么?那就相当于jum 数据
   数据要用什么存放?当然是寄存器了
包括你上面的   jmp cs:ip   
其实 也是 jmp 数据:数据也就是 jmp 寄存器:寄存器
你用的debug 中所有的数据都是在寄存器中存放的 cs是表示代码段地址ds表示数据段地址 ip表示ip地址   同时这些也是数据 当需要改变的时候都需要用寄存器来传输将改变的数据替换原来的数据
所以也就有了 这样的语句
mov ax,0123h   ;将0123h赋给ax寄存器
mov cs,ax    ;将代码段地址设置为0123h
jmp ax ; 跳转   段地址保持不变   ip 地址改变为ax寄存器内数据处
页: [1]
查看完整版本: 汇编的小问题