为什么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:}
我是小白,希望大鱼们帮帮忙,百度也试过了,没找到合适的答案,我在此先谢谢了
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
首先表示感谢,但是我想实现的是利用循环来实现,而不是利用已给出的字符(!!!!!!)来实现,ps:如果用你这种方法和书中的中断章节例题是一样的,只不过换了个字符内容而已, ;我现在的问题是利用cs:ip指向下一条执行代码的地址,现在只要把ip的值向后减去一段相对位移,结合dec cx,从而实现loop指令的效果,,为了实现它,我就得把ip先推入栈呀,接着将ip +bx[[[[]]]那么问题来了,挖掘机技术那家强。。。。。。。。;嘿嘿,然后我就想利用push ip,来实现呀,(书中是直接利用 int 7ch,调用这一中断,计算机自动实现保存相关寄存器,可是我不需要调用这个内存呀,只好用最傻的办法了push:ip,然后就悲剧了);要是真如你说的那样,OpCode表。这个表中只有下面附件表。这个表没有IP寄存器,所以汇编程序中不能出现操作ip的代码,那我就投降了,呜呜,再次表示感谢,朋友:lol: 流行语 发表于 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的代码,那我就投降了,呜呜,再次表示感谢,朋友
别删我贴我是新鱼油今天试了一天发现小甲鱼的视频不能下载这是怎么回事 难道要冲VIP 我是想学数据结构的,前几天都能下载
别删我贴我是新鱼油今天试了一天发现小甲鱼的视频不能下载这是怎么回事 难道要冲VIP 我是想学数据结构的,前几天都能下载 你再看看,如果不能下载了。我传给你啊! 不会,帮楼主顶上去 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
唉,终于搞出来了,有同样问题的同学看看吧
好难哪 休闲娱乐之际,来观摩学习 为什么我感觉那个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
本人小白,个人见解 ding! 看看 kabkanb eryi 看而已
看看而已
看看而已
页:
[1]
2