结束装配程序

时间:2015-12-21 21:22:00

标签: assembly masm x86-16 dosbox

我最近开始编写装配程序。我的问题是我不知道如何结束程序。我写了下面的代码,在我添加之前,它没有显示所需的输出  jmp finish 在第二个函数调用之后。我不明白为什么这个程序没有完成它自己的工作。我真的很感激你的解释。

            Data_segment_name segment para

            Data_segment_name ends


            Stack_segment_name segment para stack
            dw 16 dup(0)             ;define your stack segment
            Stack_segment_name ends


            Code_segment_name segment
            Main_prog proc far

            assume SS:Stack_segment_name,CS:Code_segment_name,DS:Data_segment_name

            mov AX,Data_segment_name  ;load the starting address of the data
            mov DS,AX                 ; segment into DS reg.

            call cls
            call draw1
            ;jmp finish
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            cls proc near
            mov ax,0b800h
            mov es,ax
            mov ax,0720h
            mov di,0
            mov cx,2000
            rep stosw 
            ret
            cls endp
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            draw1 proc near       
            push ax

            mov di,160*9+40*2 
            mov ax,0b800h
            mov es,ax
            mov ax, 1f2ah             
            stosw
            cld


            pop ax
            ret
            draw1 endp

            finish:
            mov ax,4c00h ; exit program
            int 21h
            Main_prog endp
            Code_segment_name ends
            end Main_prog

1 个答案:

答案 0 :(得分:0)

可能最好的解决方案是将finish代码放在主模块中,这样就可以从主模块中设置初始值,调用子程序和退出。

否则,当第一个子程序“返回”时,你的代码只会从主模块“掉进”到子程序中并丢失,或者是段错误。