qwe1231069 发表于 2016-10-12 20:58:05

关于堆栈的问题

本帖最后由 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一切就正常了,我这里哪里错了呢?

人造人 发表于 2016-10-13 00:15:48


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

zzzz76 发表于 2016-10-13 01:05:16

二楼正解,ol应该接在loops 后面才对
回到start的原因是ret返回时cs、ip获得的出栈值错位了

qwe1231069 发表于 2016-10-13 13:01:48

本帖最后由 qwe1231069 于 2016-10-13 13:08 编辑

人造人 发表于 2016-10-13 00:15
assume cs:code,ds:data

data segment


能跟我详细说一下jcxz的运行原理,也就是jcxz是如何运作的,如何影响堆栈。书上没有写
他只说相当于jmp,没提到堆栈

人造人 发表于 2016-10-13 16:35:04

qwe1231069 发表于 2016-10-13 13:01
能跟我详细说一下jcxz的运行原理,也就是jcxz是如何运作的,如何影响堆栈。书上没有写
他只说相当于jm ...

jcxz和堆栈没有关系
正如图片所说
jcxz 标号 (如果(cx)=0,转移到标号处执行)

qwe1231069 发表于 2016-10-13 17:15:02

人造人 发表于 2016-10-13 16:35
jcxz和堆栈没有关系
正如图片所说
jcxz 标号 (如果(cx)=0,转移到标号处执行)

我傻了
想错了、现在明白了

人造人 发表于 2016-10-13 18:35:11

qwe1231069 发表于 2016-10-13 17:15
我傻了
想错了、现在明白了

页: [1]
查看完整版本: 关于堆栈的问题