
程序调用用call指令,调用的子程序必须已经写在程序里。
系统会自动把子程序的返回地址(即调用程序中call指令的下一条指令的地址)存入堆栈,子程序执行后也会自动把堆栈中存的地址取出。
你的子程序放的位置不对,修改如下:
DATAS SEGMENT
str1 db 'again$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
main proc far
START:
MOV AX,DATAS
MOV DS,AX
call crlf
call crlf
call crlf
MOV AH,4CH
INT 21H
main endp
;====================
crlf proc near
mov ah,9
mov dx,offset str1
int 21h
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
ret
crlf endp
;==================
CODES ENDS
END START
我的程序是KEIL编译的,如下
先申明
EXTRN CODE (_Send_CRC) ;Send_CRC是C中的函数,汇编中加了_
调用的时候
LCALL _Send_CRC
如果要使用C中的变量,那么CODE变成相应的DATA,XDATA等
ACALL是短调用指令。短表现在所调用的子程序地址必须与ACALL指令下一条指令的第一个字节在同一个2KB区内(即16位地址中的高5位地址相同),否则将引起程序转移混乱
LCALL长调用指令可以调用64kb范围内程序存储器中的任何一个子程序。
以上就是关于在用汇编语言编程时,程序调用与堆栈如何使用全部的内容,包括:在用汇编语言编程时,程序调用与堆栈如何使用、汇编子程序的问题、51单片机中汇编语言如何调用C的子程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)