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有效,请用你所做的“回答”这个问题。不在评论中。谢谢