|
主题 : : 如何读取IP寄存器?请注意,是“读取”而不是“修改”IP寄存器。 [待解决] |
回复[ 9次 ]
点击[ 415次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2012-11-03 08:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-10-19 12:17 |
我需要获得IP寄存器的值,但下列指令无法通过编译:
mov si, ip
所以又改成了
mov ax, ip
还是无法通过编译。
每次都是一样的错误提示信息:IP符号未定义。
请教各位该如何获取IP寄存器的内容呢? | | |
|
|
|
|
[第1楼]
[ 回复时间:2012-11-03 11:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36 |
|
|
|
|
|
[第2楼]
[ 回复时间:2012-11-03 21:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-10-19 12:17 |
push ip
------------------
回复:
这个我试过了,无法通过编译。一样的错误信息:符号IP未定义。
我开始怀疑在汇编程序里除了定义IP外任何时候都将IP视为未定义符号,于是我把ip定义成一个标号:
ip:
mov bl, ah
mov bh, 0
add bx, bx
......
结果编译通过,未出现任何警告或错误信息。这就意味着汇编程序确实根本就不识ip符号。这样我才能在程序里定义它。
我又尝试使用汇编语言的其它关键字作为标号使用,看看是否有不同的结果:
mov:
mov bl, ah
mov bh, 0
add bx, bx
......
编译结果如下:未出现严重错误信息,但出现警告信息:保留字mov作为符号使用(warning A4016: Reserved word used as symbol:MOV)
很显然,汇编程序将mov作为保留字,所以才会出现上述警告信息。
看来ip确实只能“写”而不能“读”。“只读”早就习以为常了,“只写”还是头一次碰到,呵呵。
最后说一下我为什么要读取ip的值:
在实验16中,安装中断程序后我必须获得中断程序的首条指令的偏移地址。如果能够读取ip,那么就能够很容易获得此偏移地址。无论将中断程序安装在内存的任何位置,获得中断程序首条指令偏移地址的指令都无须做任何改变。但现在由于无法读取ip,此偏移地址只能根据中断程序的安装位置直接获取,如果中断程序的安装位置变了,我就得改这个偏移地址。虽然只是改几条指令的事情,但毕竟程序失去灵活性了。
谢谢。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2012-11-04 06:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36 |
1.表示可以push ip
2.ip和mov不是一回事,ip是寄存器。mov是汇编代码。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2012-11-04 12:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-10-19 12:17 |
1.表示可以push ip
真的很希望如你所言,可以在汇编程序里push ip。但经过再次测试之后,我不得不再次表示确实不可以push ip。
2.ip和mov不是一回事,ip是寄存器。mov是汇编代码。
的确。一个是寄存器,一个是汇编指令,我也觉得用mov做测试没有足够的说服力。所以此次我使用bp寄存器做标号,依然产生相同的编译结果。接着我依次使用ax,si,ds作为标号进行测试,依旧产生类似编译信息,应该足以说明问题,不用对所有寄存器一一进行测试吧?
我的完整测试汇编程序如下:
assume cs:code
code segment
start:
push ip
bp:
mov ax, 4c00h
int 21h
code ends
end start
在Windows XP SP3内置的DOS下编译后产生如下编译信息:
c:\test.asm(6): error A2009: Symbol not defined: IP
c:\test.asm(7): warning A4016: Reserved word used as symbol: BP (BP可替换为AX, SI, DS...)
请问你是在什么环境下使得包含push ip指令的汇编程序可以顺利通过编译呢?
谢谢。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2012-11-04 13:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36 |
|
|
|
|
|
[第6楼]
[ 回复时间:2012-11-24 00:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-11-24 00:25 |
其实你也可以利用call
------------------
回复:正解,且是x86获得ip的唯一的办法
call foo
add ebx,3
。。。
foo:pop eax ; eax就是add ebx,3指令的地址 | | |
|
|
|
|
[第7楼]
[ 回复时间:2013-01-01 19:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-01 17:35 |
你可以先call一下,这时系统把ip压入堆栈了,你call的这一段代码可以写一个从堆栈中取出数值的程序 | | |
|
|
|
|
[第8楼]
[ 回复时间:2013-04-14 21:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-04-11 23:46 |
|
|
|
|
|
[第9楼]
[ 回复时间:2013-07-08 00:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-07-08 00:39 |
IP寄存器属于不可见寄存器。指令集中没有IP元素。 | | |