关于堆栈的问题
本帖最后由 qwe1231069 于 2016-10-12 20:59 编辑这是实验十的代码,我想改一下。让它可以直接调用,不用担心寄存器的值,也就是把它所用的寄存器都加入堆栈。我加了三个push和pop
assume cs:code,ds:data
data segment
db'qweqwrt',0
data ends
code segment
start:
mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:
push es
push ax
push bx
mov ax,0b800h
mov es,ax ;初始化
mov ah,0
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax ;bx==要复制的显存地址
mov ah,cl
mov dh,cl
s: mov cl,dh
mov al,ds:
mov ch,al
mov cl,0
jcxz ol
mov word ptr es:,ax ;ax是复制的值
inc si
add bx,2
loop s
pop bx
pop ax
pop es
ol:
ret
code ends
end start
程序返回时竟然回到了start处,不明白啊。如果去掉push和pop一切就正常了,我这里哪里错了呢?
assume cs:code,ds:data
data segment
db'qweqwrt',0
data ends
code segment
start:
mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:
push es
push ax
push bx
mov ax,0b800h
mov es,ax ;初始化
mov ah,0
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax ;bx==要复制的显存地址
mov ah,cl
mov dh,cl
s: mov cl,dh
mov al,ds:
mov ch,al
mov cl,0
jcxz ol ;你确定是跳到ol?,跳到ol后堆栈不再平衡
mov word ptr es:,ax ;ax是复制的值
inc si
add bx,2
loop s
pop bx
pop ax
pop es
ol:
ret
code ends
end start 二楼正解,ol应该接在loops 后面才对
回到start的原因是ret返回时cs、ip获得的出栈值错位了 本帖最后由 qwe1231069 于 2016-10-13 13:08 编辑
人造人 发表于 2016-10-13 00:15
assume cs:code,ds:data
data segment
能跟我详细说一下jcxz的运行原理,也就是jcxz是如何运作的,如何影响堆栈。书上没有写
他只说相当于jmp,没提到堆栈
qwe1231069 发表于 2016-10-13 13:01
能跟我详细说一下jcxz的运行原理,也就是jcxz是如何运作的,如何影响堆栈。书上没有写
他只说相当于jm ...
jcxz和堆栈没有关系
正如图片所说
jcxz 标号 (如果(cx)=0,转移到标号处执行) 人造人 发表于 2016-10-13 16:35
jcxz和堆栈没有关系
正如图片所说
jcxz 标号 (如果(cx)=0,转移到标号处执行)
我傻了
想错了、现在明白了 qwe1231069 发表于 2016-10-13 17:15
我傻了
想错了、现在明白了
哦
页:
[1]