8086汇编下如何得到当前的ip值

benu 2004-12-25 03:57:43
也就是说,我在编写汇编的时候,如何知道从代码段开始到当前指令有多少个字节。我想ip的值应该就是吧,可不知怎么获得。
...全文
600 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
benu 2005-01-07
  • 打赏
  • 举报
回复
该结帖了,多谢大家。
总结:
1。初雪的方式是正确的,但是多减了个1
2。jim138的方式也是正确的
3。$ $$ 在这题中没有用。

多谢大家
jim138 2004-12-30
  • 打赏
  • 举报
回复
CX应为要移动代码的字节数.
jim138 2004-12-30
  • 打赏
  • 举报
回复
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,d-code
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
d:
mov ax,4c00h
int 21h
code ends
end


xemean 2004-12-30
  • 打赏
  • 举报
回复
在NASM里(MASM好象也有)
$ 表示当前地址
$$表示程序开始地址

比如:
codestart:
...
...
label:
mov eax,label-codestart ; 也相当于 mov eax,$-$$
...
...
dd $-$$ ; 从代码开始到当前的大小

这是编译器自己的规则
VxD1 2004-12-28
  • 打赏
  • 举报
回复
唉,太可惜了,没标准答案,也没个高手来给个非常正确答案
benu 2004-12-26
  • 打赏
  • 举报
回复
$-$$ ??? 是什么意思?

呵呵,我也不知道标准答案是什么。
VxD1 2004-12-26
  • 打赏
  • 举报
回复
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,offset d-offset code-1
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
d:mov ax,4c00h
int 21h
code ends
end

不知道这样对不对
Allen 2004-12-26
  • 打赏
  • 举报
回复
上面说错了,是20:0处
Allen 2004-12-26
  • 打赏
  • 举报
回复
没怎么看清程序,不过CX应该是计数,如果你的确是移"mov ax,4c00h"的话,那么就是这个指令的字节长度。并且,题目和程序有矛盾,从程序上看是"复制到内容200:0处"

I like dos virii ;-)
kokblack 2004-12-26
  • 打赏
  • 举报
回复
嗯,有意思,我kK :)
xemean 2004-12-26
  • 打赏
  • 举报
回复
$-$$
VxD1 2004-12-26
  • 打赏
  • 举报
回复
如果是对的那就打分吧,我想凑颗星星
VxD1 2004-12-26
  • 打赏
  • 举报
回复
真的吗?我的答案是标准答案吗?
benu 2004-12-26
  • 打赏
  • 举报
回复
1。复制到20:0处和复制到0:200处是一样的吧。程序中的写法只是让偏移地址从0开始计算,如果将段地址设为0,那么偏移地址就是从200开始了,这个问题不是错误;
2。要复制的不是mov ax,4c00h这条指令的语句,而是从代码段开始到这条语句直接的所有指令
3。因此,问题的关键就是怎么求出2中所说的语句段的长度,初雪的解决方法是正确的,多谢
benu 2004-12-25
  • 打赏
  • 举报
回复
----------------------------------------
一般病毒的做法是:
call l_next
l_next:
pop xx ; 这时 xx 中就是 l_next 处的指令的地址了.
; 不过, 据说凭这两个指令, 你的代码也可能被认定是病毒的
----------------------------------------
我以前看过说这是取得当前pc值的唯一办法,把这当成病毒那不是打击面有点广了?呵呵

可能我对我原来的问题描述不清楚或者是理解有误,我还是把原题写出来吧。
题:
下面的程序的功能是将"mov ax,4c00h"之前的指令复制到内容0:200处,补全程序
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,____
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end

呵呵,打了原题,我才发现我原来的理解有误,找ip值是不对的。可我还是不知到上面那题怎么做,请教大家。
benu 2004-12-25
  • 打赏
  • 举报
回复
我刚刚看,还没有调用子程序,呵呵。
就是从入口地址开始,连续执行,也没有超过一个段的长度。
这种情况下怎么求?
另外,说到子程序,那么,子程序中求当前执行语句到该子程序所在段地址的字节数怎么求? 也是偏移吗?
clumsy 2004-12-25
  • 打赏
  • 举报
回复
一般病毒的做法是:
call l_next
l_next:
pop xx ; 这时 xx 中就是 l_next 处的指令的地址了.
; 不过, 据说凭这两个指令, 你的代码也可能被认定是病毒的
kokblack 2004-12-25
  • 打赏
  • 举报
回复
这也不一定吧,如果调用子程序的话,IP的变化就不是连续的啦!

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧