Assembly 结束装配过程

Assembly 结束装配过程,assembly,masm,x86-16,dosbox,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)

我最近开始编写汇编程序。我的问题是我不知道如何结束一个过程。我在下面编写了代码,直到添加
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

最好的解决方案可能是将
finish
代码放在主模块中,这样就可以设置初始值、调用子例程和退出,所有这些都从主模块中进行


否则,当第一个子例程“返回”时,您的代码将从主模块“掉到”子例程中,并丢失或segfault。

您将程序嵌套到
main\u prog
中,这就是原因。您应该将从
finish:
开始的4行上移到
jmp finish
。感谢您的快速回复。不过我还有一个问题,如何编写过程而不将它们嵌套到far过程中@杰斯特告诉过你怎么做的。向上移动结尾,包括
Main_prog endp
。是的,我这样做了,效果很好。我只是想知道我是否可以删除整个Main_prog,只编写我的过程并调用它们,但我认为这行不通。无论如何,谢谢你@jesterI认为您不需要一个主过程,但仍然需要一个入口点标签。这对meso有效,请用你所做的“回答”这个问题。不在评论中。谢谢