逆流杀 发表于 2014-10-11 23:05:32

为什么ip推进不了栈

先说说我写着代码的目的,[是为了实现当一个程序出现除法溢出时,自动调用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:,200h;
           mov word ptr es:,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
          
           puship
           s10:
           mov byte ptr es:, '!'
          
           push bp
           mov bp,sp
           add,bx
          
           dec cx
           jcxz s11
                               
           s11:
           pop bp
           iret
                                               ;这一段是模仿书上的实现loop的代码
           mov ax,4c00h
           int 21h
           s2:nop
          
           code ends
           end start
          
          
          
           额,对了,能解释一下为什么puship就显示错误吗,{:9_234:}
我是小白,希望大鱼们帮帮忙,百度也试过了,没找到合适的答案,我在此先谢谢了
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          

流行语 发表于 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:,200h
          mov word ptr es:,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,
          mov es:,al
          inc si
          add di,1
          mov al,02h
          mov es:,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

逆流杀 发表于 2014-10-12 22:19:01

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

逆流杀 发表于 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[[[[]]]那么问题来了,挖掘机技术那家强。。。。。。。。;嘿嘿,然后我就想利用push ip,来实现呀,(书中是直接利用 int 7ch,调用这一中断,计算机自动实现保存相关寄存器,可是我不需要调用这个内存呀,只好用最傻的办法了push:ip,然后就悲剧了);要是真如你说的那样,OpCode表。这个表中只有下面附件表。这个表没有IP寄存器,所以汇编程序中不能出现操作ip的代码,那我就投降了,呜呜,再次表示感谢,朋友

黄志伟 发表于 2014-10-12 22:47:02


别删我贴我是新鱼油今天试了一天发现小甲鱼的视频不能下载这是怎么回事 难道要冲VIP 我是想学数据结构的,前几天都能下载

黄志伟 发表于 2014-10-12 22:47:39


别删我贴我是新鱼油今天试了一天发现小甲鱼的视频不能下载这是怎么回事 难道要冲VIP 我是想学数据结构的,前几天都能下载

流行语 发表于 2014-10-13 08:10:30

你再看看,如果不能下载了。我传给你啊!

ilboyvm 发表于 2014-10-13 23:02:29

不会,帮楼主顶上去

逆流杀 发表于 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:,0h       
       
    mov word ptr es:,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:,'!'
        mov byte ptr es:,0a0h
        add bx,2
        int 7ch
        ciculateend :nop
       
        mov ax,4c00h
        int 21h;以上是普通的在显存存取位置显示字符代码 ,以下是实现loop指令效果的指令原代码段,也是要按装的int7ch程序的原地址
       
        source :
        push bp
        mov bp,sp
       
        jcxzok
        add ,si ;这里因为是ds==es,所以不用担心寄存器
        dec cx
       
       
        ok:
        pop bp
        iret
    sourceend :nop
       
       
       code ends
       end start
       
       
       
       
       
       
       
       
       
       
       
        唉,终于搞出来了,有同样问题的同学看看吧
       
       

大个的糖果 发表于 2014-11-1 06:29:13

lyjztz 发表于 2014-11-24 16:13:53

好难哪

帅哥星 发表于 2014-12-2 20:22:37

xx6625303 发表于 2015-2-16 13:11:50

休闲娱乐之际,来观摩学习

jies147 发表于 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

本人小白,个人见解

caster 发表于 2015-6-18 13:13:19

ding!

caster 发表于 2015-6-18 19:25:39

看看

Loading.... 发表于 2015-6-18 19:30:09

kabkanb eryi

Loading.... 发表于 2015-6-18 19:30:56

看而已

Loading.... 发表于 2015-6-18 19:35:05


看看而已

Loading.... 发表于 2015-6-18 19:35:38


看看而已
页: [1] 2
查看完整版本: 为什么ip推进不了栈