鱼C论坛

 找回密码
 立即注册
查看: 2732|回复: 4

[已解决]实验10第一问求助

[复制链接]
发表于 2022-3-18 22:55:27 | 显示全部楼层 |阅读模式
2鱼币
想问一下,小甲鱼在实验10,这个push cx还有push si的作用的什么,我省略了这一步,依然可以正常达到目的,很疑惑,请大家解答一下
下边是代码;push的指令被我注释了

assume cs:code

data segment
        db 'Welcome to masm!',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 cx
                                ;push si
                               
                                mov al,0a0h
                               
                                dec dh
                                mul dh
                                mov bx,ax
                               
                                mov al,2
                                mul dl
                                sub ax,2
                               
                                add bx,ax
                               
                                mov ax,0b800h
                                mov es,ax
                               
                                mov di,0
                               
                                mov al,cl
                                mov ch,0
                               
                        s:        mov cl,ds:[si]
               
                                jcxz ok
                               
                                mov es:[bx+di],cl
                                mov es:[bx+di+1],al
                               
                                inc si
                               
                                add di,2
                               
                                jmp short s
                       
                ok:       
                        ;pop si
                        ;pop cx
                        ret
code ends
end start
最佳答案
2022-3-18 22:55:28
本帖最后由 jackz007 于 2022-3-20 00:15 编辑

      要看怎么说了,就本例而言,在调用过子程序以后,程序就直接结束了,属于特殊情况,确实没必要在子程序中利用堆栈保护那两个寄存器。
      但是,我们在编写汇编语言子程序(或中断服务程序)的时候,通常应该遵守 "绿色环保" 的原则,就是要确保调用子程序(或中断服务程序)前后,所有的寄存器内容不会发生意外的改变,这就要求在子程序(或中断服务程序)内,对所有需要用到的寄存器必须做到先保存再使用,在退出前进行恢复的原则。本例应该是想这么做,但是,做的不彻底而已。
      
      

最佳答案

查看完整内容

要看怎么说了,就本例而言,在调用过子程序以后,程序就直接结束了,属于特殊情况,确实没必要在子程序中利用堆栈保护那两个寄存器。 但是,我们在编写汇编语言子程序(或中断服务程序)的时候,通常应该遵守 "绿色环保" 的原则,就是要确保调用子程序(或中断服务程序)前后,所有的寄存器内容不会发生意外的改变,这就要求在子程序(或中断服务程序)内,对所有需要用到的寄存器必须做到先保存再使用,在退出前进行 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 22:55:28 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-3-20 00:15 编辑

      要看怎么说了,就本例而言,在调用过子程序以后,程序就直接结束了,属于特殊情况,确实没必要在子程序中利用堆栈保护那两个寄存器。
      但是,我们在编写汇编语言子程序(或中断服务程序)的时候,通常应该遵守 "绿色环保" 的原则,就是要确保调用子程序(或中断服务程序)前后,所有的寄存器内容不会发生意外的改变,这就要求在子程序(或中断服务程序)内,对所有需要用到的寄存器必须做到先保存再使用,在退出前进行恢复的原则。本例应该是想这么做,但是,做的不彻底而已。
      
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-19 00:45:30 | 显示全部楼层
本帖最后由 jackz007 于 2022-3-19 00:48 编辑

      在汇编语言中,push 是数据入栈指令,就是把一个数据先临时保存到堆栈内,等到需要的时候,再通过 pop 指令从堆栈中取出。堆栈操作遵循后进先出的规则,最后入栈的数据最先出栈,使用堆栈必须要注意,入栈(push)与出栈(pop)指令必须成对出现,就是说,必须保持堆栈平衡。
      那么,为什么要使用堆栈呢?因为很多指令例如,mul、div、movsb、lodsb、loop 等操作都会直接影响一部分存储器的数值,而在这个过程中,我们并不希望这些寄存器的数值被改变,这个时候,就可以在执行指令前,先对相关的存储器执行 push 指令,等执行完目标指令后,再 pop 回原来的寄存器就可以了。
  1. assume cs:code
  2. stack segment para stack 'STACK'
  3.     db 400h dup(0)
  4. stack ends
  5. code segment para public 'CODE'
  6. main proc far
  7.        mov ax,10h  ; ax = 10h
  8.        mov bx,20h  ; bx = 20h
  9.        mov cx,30h  ; cx = 30h
  10.        mov dx,40h  ; dx = 40h
  11.        mov si,50h  ; si = 50h
  12.        mov di,60h  ; di = 60h
  13.        push ax     ; 10h 入栈
  14.        push bx     ; 20h 入栈
  15.        push cx     ; 30h 入栈
  16.        push dx     ; 40h 入栈
  17.        push si     ; 50h 入栈
  18.        push di     ; 60h 入栈
  19.        pop ax      ; 60h 出栈,ax = 60h
  20.        pop bx      ; 50h 出栈,bx = 50h
  21.        pop cx      ; 40h 出栈,cx = 40h
  22.        pop dx      ; 30h 出栈,dx = 30h
  23.        pop si      ; 20h 出栈,si = 20h
  24.        pop di      ; 10h 出栈,di = 10h
  25.        mov ax,4c00h
  26.        int 21h
  27. main endp
  28. code ends
  29. end main
复制代码

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

使用道具 举报

 楼主| 发表于 2022-3-19 11:13:42 | 显示全部楼层
jackz007 发表于 2022-3-19 00:45
在汇编语言中,push 是数据入栈指令,就是把一个数据先临时保存到堆栈内,等到需要的时候,再通过 po ...

我知道,我是说我发的代码似乎没有必要用到push,用了push是不是多此一举了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-21 12:34:52 | 显示全部楼层
对,刚开始练手也按最规则来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-5 03:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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