. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  如何读取IP寄存器?请注意,是“读取”而不是“修改”IP寄存器。  [待解决] 回复[ 9次 ]   点击[ 415次 ]  
copperzheng
[帖 主]   [ 发表时间:2012-11-03 08:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-10-19 12:17
我需要获得IP寄存器的值,但下列指令无法通过编译:
mov si, ip
所以又改成了
mov ax, ip
还是无法通过编译。
每次都是一样的错误提示信息:IP符号未定义。

请教各位该如何获取IP寄存器的内容呢?
fpamc
[第1楼]   [ 回复时间:2012-11-03 11:39 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
push ip
copperzheng
[第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,此偏移地址只能根据中断程序的安装位置直接获取,如果中断程序的安装位置变了,我就得改这个偏移地址。虽然只是改几条指令的事情,但毕竟程序失去灵活性了。

谢谢。
fpamc
[第3楼]   [ 回复时间:2012-11-04 06:48 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
1.表示可以push ip
2.ip和mov不是一回事,ip是寄存器。mov是汇编代码。
copperzheng
[第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指令的汇编程序可以顺利通过编译呢?

谢谢。
fpamc
[第5楼]   [ 回复时间:2012-11-04 13:26 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
其实你也可以利用call
enlinux
[第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指令的地址
mengdana
[第7楼]   [ 回复时间:2013-01-01 19:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-01-01 17:35
你可以先call一下,这时系统把ip压入堆栈了,你call的这一段代码可以写一个从堆栈中取出数值的程序
form4.c
[第8楼]   [ 回复时间:2013-04-14 21:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-04-11 23:46
用call ret可以实现的吧。。。
xiuxianren
[第9楼]   [ 回复时间:2013-07-08 00:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-07-08 00:39
IP寄存器属于不可见寄存器。指令集中没有IP元素。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved