鱼C论坛

 找回密码
 立即注册
查看: 2849|回复: 22

为什么ip推进不了栈

[复制链接]
发表于 2014-10-11 23:05:32 | 显示全部楼层 |阅读模式
80鱼币
先说说我写着代码的目的,[是为了实现当一个程序出现除法溢出时,自动调用int 0 中断,然后我将电脑自带int 0 中断程序变成出现10个‘’!‘’,
要实现10个‘’!‘’,可以直接用loop指令就是,但是正好书中说要利用int 7ch实现loop指令,我就尝试将loop指令替换成普通的程序,但是,唉,但是编译push ip总是提示错误,],

我将我写的错误代码附上,希望,能同志们帮忙改一下,或者是你自己写一个也行,我学习一下,就是实现当出现除法溢出时,电脑提示10个‘’!‘’,而不是overflow;并且不能用loop指令,至于loop指令被替换的程序,我会附上书上的图片。



          
  assume cs:code


           code segment
           start:
           mov ax,cs
           mov ds,ax
           mov si,offset s1  ;指向源地址
          
           mov ax,0
           mov es,ax
           mov di,200h        ;指向安装地址
          
           cld
           mov cx,offset s2- offset s1
           rep movsb
          
           mov ax,0
           mov word ptr es:[0*4],200h  ;
           mov word ptr es:[0*4+2],0          ;写好中断向量表
          
           mov ax,4c00h
           int 21h
          
           s1:                       ;安装的程序的主体
           mov ax,0b800h
           mov es,ax
           mov di ,10*160+36*2
           mov cx ,10
          
           mov bx,offset s11- offset s10   ;这个是为了将下面的ip和它相加,实现返回此处,从而实现loop的效果
          
           push cs
          
           push  ip
           s10:
           mov byte ptr es:[di], '!'
          
           push bp
           mov bp,sp
           add  [bp+4],bx
          
           dec cx
           jcxz s11
                               
           s11:
           pop bp
           iret
                                               ;这一段是模仿书上的实现loop的代码
           mov ax,4c00h
           int 21h
           s2:nop
          
           code ends
           end start
           000.PNG 1111.PNG
          
          
           额,对了,能解释一下为什么push  ip就显示错误吗,
我是小白,希望大鱼们帮帮忙,百度也试过了,没找到合适的答案,我在此先谢谢了
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-12 16:10:38 | 显示全部楼层
assume cs:code

code segment
start:mov ax,cs
          mov ds,ax
          mov si,offset do0        ;设置ds:si指向源地址
          
          mov ax,20h
          mov es,ax
          mov di,0h
          
          mov cx, offset do0end - offset do0
          
          cld                                ;设置cx传输方向
          rep movsb
          
          ;设置中断向量表中中断地址
          mov ax,0
          mov es,ax
          mov word ptr es:[0*4],200h
          mov word ptr es:[0*4+2],0
          
          mov ax,4c00h
          int 21h
  do0:jmp short do0start
                ;db "overflow!"
                db "!!!!!!!!!"
do0start:mov ax,cs
          mov ds,ax
          mov si,202h
          mov ax,0b800h
          mov es,ax
          mov di,12*160+36*2
          
          mov cx,9
   s: mov al,[si]
          mov es:[di],al
          inc si
          add di,1
          mov al,02h
          mov es:[di],al
          inc di
          dec cx
          cmp cx,0
          ja s
          ;loop s
          
          mov ax,4c00h
          int 21h
 do0end:nop
code ends
end start
不知道是否是你要的?
为什么不能push ip?
这个得从Inter指令说起,因为CPU是不认识汇编代码的,汇编程序最终全都需要编译成二进制。所以每条汇编指令都需要翻译成相对应的指令,CPU才能执行我们写的程序。那汇编程序翻译成对应的二进制代码需要对应的规则,这个规则就是OpCode表。这个表中只有下面附件表。这个表没有IP寄存器,所以汇编程序中不能出现操作ip的代码。不知道我说清楚没有,能力有限啊~:cry
无标题.png

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +3 收起 理由
逆流杀 + 5 + 5 + 3 谢谢你的帮助,嘿嘿
拈花小仙 + 5 + 5 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-12 22:19:01 | 显示全部楼层
首先表示感谢,但是我想实现的是利用循环来实现,而不是利用已给出的字符(!!!!!!)来实现,ps:如果用你这种方法和书中的中断章节例题是一样的,只不过换了个字符内容而已, ;我现在的问题是利用cs:ip指向下一条执行代码的地址,现在只要把ip的值向后减去一段相对位移,结合dec cx,从而实现loop指令的效果,,为了实现它,我就得把ip先推入栈呀,接着将ip +bx[[[[[mov bx,offset s11- offset s10   ;这个是为了将下面的ip和它相加,实现返回此处,从而实现loop的效果]]]]那么问题来了,挖掘机技术那家强。。。。。。。。;嘿嘿,然后我就想利用push ip,来实现呀,(书中是直接利用 int 7ch,调用这一中断,计算机自动实现保存相关寄存器,可是我不需要调用这个内存呀,只好用最傻的办法了push:ip,然后就悲剧了);要是真如你说的那样,OpCode表。这个表中只有下面附件表。这个表没有IP寄存器,所以汇编程序中不能出现操作ip的代码,那我就投降了,呜呜,再次表示感谢,朋友:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-12 22:19:36 | 显示全部楼层
流行语 发表于 2014-10-12 16:10
不知道是否是你要的?
为什么不能push ip?
这个得从Inter指令说起,因为CPU是不认识汇编代码的,汇编程 ...

首先表示感谢,但是我想实现的是利用循环来实现,而不是利用已给出的字符(!!!!!!)来实现,ps:如果用你这种方法和书中的中断章节例题是一样的,只不过换了个字符内容而已, ;我现在的问题是利用cs:ip指向下一条执行代码的地址,现在只要把ip的值向后减去一段相对位移,结合dec cx,从而实现loop指令的效果,,为了实现它,我就得把ip先推入栈呀,接着将ip +bx[[[[[mov bx,offset s11- offset s10   ;这个是为了将下面的ip和它相加,实现返回此处,从而实现loop的效果]]]]那么问题来了,挖掘机技术那家强。。。。。。。。;嘿嘿,然后我就想利用push ip,来实现呀,(书中是直接利用 int 7ch,调用这一中断,计算机自动实现保存相关寄存器,可是我不需要调用这个内存呀,只好用最傻的办法了push:ip,然后就悲剧了);要是真如你说的那样,OpCode表。这个表中只有下面附件表。这个表没有IP寄存器,所以汇编程序中不能出现操作ip的代码,那我就投降了,呜呜,再次表示感谢,朋友
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-12 22:47:02 | 显示全部楼层

别删我贴  我是新鱼油今天试了一天发现小甲鱼的视频不能下载这是怎么回事 难道要冲VIP 我是想学数据结构的,前几天都能下载
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-12 22:47:39 | 显示全部楼层

别删我贴  我是新鱼油今天试了一天发现小甲鱼的视频不能下载这是怎么回事 难道要冲VIP 我是想学数据结构的,前几天都能下载
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-13 08:10:30 | 显示全部楼层
你再看看,如果不能下载了。我传给你啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-13 23:02:29 | 显示全部楼层
不会,帮楼主顶上去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-18 10:44:16 | 显示全部楼层
assume cs:code
               
    code segment      
    start:
        mov ax,cs
        mov ds,ax
        mov si, offset source
       
        mov ax,0       
        mov es,ax
        mov di,200h;将其放在一段安全的内存空间中(0:200h)
       
        mov cx,offset sourceend - offset source  
       
        cld
        rep movsb
       
    mov word ptr es:[7ch*4+2],0h       
       
    mov word ptr es:[7ch*4],200h;以上是安装int7ch准备工作
       
       
       
       
        mov ax,0b800h
        mov es,ax
        mov bx,8*160
        mov si,offset ciculate - offset ciculateend
        mov cx,30
       
        ciculate:
        mov byte ptr es:[bx],'!'
        mov byte ptr es:[bx+1],0a0h
        add bx,2
        int 7ch
        ciculateend :nop
       
        mov ax,4c00h
        int 21h;以上是普通的在显存存取位置显示字符代码 ,以下是实现loop指令效果的指令原代码段,也是要按装的int7ch程序的原地址
       
        source :
        push bp
        mov bp,sp
       
        jcxz  ok
        add [bp+2],si ;这里因为是ds==es,所以不用担心寄存器
        dec cx
       
       
        ok:
        pop bp
        iret
    sourceend :nop
       
       
         code ends
         end start
       
       
       
       
       
       
       
       
       
       
       
        唉,终于搞出来了,有同样问题的同学看看吧
       
       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2014-11-1 06:29:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-24 16:13:53 | 显示全部楼层
好难哪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2014-12-2 20:22:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-16 13:11:50 | 显示全部楼层
休闲娱乐之际,来观摩学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 10:02:33 | 显示全部楼层
为什么我感觉那个push ip报错是因为没有设置栈段,比如:

assume ss:stack
stack segment
  db 16 dup(0)
stack ends
code segment
     mov ax,stack
     mov ss,ax
     mov sp,16
       ..........
code ends

本人小白,个人见解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 13:13:19 | 显示全部楼层
ding!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 19:25:39 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 19:30:09 | 显示全部楼层
kabkanb eryi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 19:30:56 | 显示全部楼层
看而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 19:35:05 | 显示全部楼层

看看而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 19:35:38 | 显示全部楼层

看看而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 15:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表