萌辉 发表于 2013-8-25 23:36:45

汇编语言实验4第三小题关于ip

终于弄明白了,刚刚又编译调试了一下,cx里面是1ch减去mov ax,4c00h 的机器码为B8004C 3个字节
int 21h为CD21 占两个字节等于17h,我在来说一下我的理解,cs:ip指向程序的第一条段地址在cs内,所以把cs的值附给ds,用bx里的内容作偏移地址,bx初始化是0,所以第一个地址是cs:bx。我们如何知道复制的内容最后一个地址是多少?我们就需要知道这个程序的长度。在这里我提出2个疑问,如果ip里面的值不是从0开始的话,哪如何办呢?如何知道这个程序程序地址是连续的?

LinuxDeepin 发表于 2013-8-25 23:36:46

本帖最后由 LinuxDeepin 于 2013-8-26 00:04 编辑

萌辉 发表于 2013-8-25 23:59 static/image/common/back.gif
我的意思是程序前面都附完值后段地址还是在ds中bx就当做偏移地址来使用,怎么知道偏移地址是从0开始的,如果 ...
cs:ip 所指向的数据便是代码
ds:ip 所指向的数据便是数据

mov ax, 这行代码中,其实是ds:bx
至于为什么bx是零,这是系统分配机制的问题,放心吧,不会错的

LinuxDeepin 发表于 2013-8-25 23:45:45

理解错误了,cs:ip 指向第一行代码,这是由系统分配内存地址决定的。
bx 是寄存器,在用 形式中,bx寄存器中的数值,会当成偏移地址。

想知道程序的长度,建议你直接debug a命令输入即可知道

牡丹花下死做鬼 发表于 2013-8-25 23:47:37

O(∩_∩)O~这个最后那个地址就需要你自己计算了 O(∩_∩)O~
就像计算2^5 CX的值一样 你得自己计算

牡丹花下死做鬼 发表于 2013-8-25 23:50:46

还有 cs:ip是指向第一句代码的 cs:bx 这个怎么会是第一个地址呢
ds默认是bx cs默认是ip啊

LinuxDeepin 发表于 2013-8-25 23:54:51

如果不会用debug a命令写程序的话,那么你可以直接把整个程序写好,cx值随便写一个。
然后编译,debug *.exe 运行。

r 命令查看 cs 和 ip 所指向的地址,
u 命令查看地址所指向的汇编代码。
在显示出来的代码左侧,有段地址和偏移地址,你仔细看看偏移地址的变化

福禄娃娃 发表于 2013-8-25 23:55:55

本帖最后由 福禄娃娃 于 2013-8-25 23:57 编辑

复制的内容最后一个地址可以通过debug看出,单步跟踪
CX中保存的是程序的长度
CS:IP始终指向下一条指令的地址,一般情况下使用记事本写的源码用masm编译后,ip一般为0
如果在debug中通过a写入汇编指令,比如a 6000:1234回车mov ax,1 这时如果要执行mov ax,1便需要手动修改CS:IP的指向了。r cs 6000   r ip 1234
可以用d指令来查看内存中的内容,然后再用u指令便可看出指令是否连续。

萌辉 发表于 2013-8-25 23:59:33

我的意思是程序前面都附完值后段地址还是在ds中bx就当做偏移地址来使用,怎么知道偏移地址是从0开始的,如果开始的时候偏移地址不是从0开始的那在bx赋值0的话不就错了吗

萌辉 发表于 2013-8-26 00:12:39

谢谢兄弟们帮我回答,我要睡了,明天还要站着干一天活
页: [1]
查看完整版本: 汇编语言实验4第三小题关于ip