社区
汇编语言
帖子详情
8086汇编下如何得到当前的ip值
benu
2004-12-25 03:57:43
也就是说,我在编写汇编的时候,如何知道从代码段开始到当前指令有多少个字节。我想ip的值应该就是吧,可不知怎么获得。
...全文
655
18
打赏
收藏
8086汇编下如何得到当前的ip值
也就是说,我在编写汇编的时候,如何知道从代码段开始到当前指令有多少个字节。我想ip的值应该就是吧,可不知怎么获得。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的变化就不是连续的啦!
8086
汇编
指令笔记
8086
/8088
汇编
指令总结一、数据传送指令1、传送指令:MOV (move) 格式:mov dst,src 具体用法:(1) CPU内部寄存器之间的数据传送,如:mov ah,al(2) 立即数送至通用寄存器(非段寄存器)或存储单元,如:mov al,3 mov [bx],1234h(3) 寄存器与存储器间的数据传送,如:mov ax,var mov ax,[bx]
8086
及其
汇编
1 基础知识 1.1
汇编
语言的组成 机器码:一串二进制数,由 CPU 执行
汇编
指令:由对应机器码的指令,要通过编译器编译为机器码才能够运行 伪指令:对
汇编
过程进行控制的指令,不能被运行,需要翻译成
汇编
指令 1.2 指令和数据 在内存或磁盘上,指令和数据没有区别,都是一串二进制数据 CPU 工作时,将有的信息看作指令,有的看做数据 1.3 CPU 对存储器的读写 存储器被划分成多个单元,存储单元从 0 开始编号,即地址 CPU 要想进行数据读写就必须进行 3 类信息交互 存储单元的地址(地址信息) 是读
汇编
语言
8086
CPU之寄存器总结
寄存器是什么呢? 其实很简单,寄存器就是个存储信息的单元或者说是器件又或者说是容器而已,就比如内存也是一个存储介质或者说是存储单元而已,其实寄存器从理解上来说和内存差不多,只不过寄存器(这里讨论的寄存器都是 CPU 中的寄存器,不包括外设上的寄存器)位于 CPU 内部,而内存位于 CPU 外部,而且,寄存器比内存可是珍贵得多啊,就拿内存和硬盘来比,肯定是内存在使用上珍贵得多,是 PC 中的稀有资源,而寄存器是 CPU 中的稀有资源,内存和寄存器相比就像硬盘和内存相比一样 。 而对于一个
汇编
程序员来说,C
8086
汇编
语言:
8086
CPU寄存器的相关介绍
对于
8086
CPU中14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、
IP
、CS、SS、DS、ES、PSW(标志寄存器);进行了详尽的介绍!
汇编
8086
复习——基础知识、指令汇总、上机实验踩坑
Chapter II 80x86微处理器有
8086
、8088、80286等型号,我们要学习的就是
8086
微处理器的
汇编
指令系统,主要记住下表内容 型号 字长(位) 数据总线宽度(位) 地址总线宽度(位) 寻址空间
8086
16 16 20 1M 字长:计算机同一时间处理二进制数的位数叫字长 寻址空间:可理解成地址范围1M=220,计算机内部存储空间都会编上号,就像每个户人家都有一个门牌号一样,总共有1M户人家,依次被编号0~ 220-1, 由于地址总线的宽度是20位,而数据总线宽度只有
汇编语言
21,500
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章