. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->INT指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  INT 21H的返回值有什么用?  [待解决] 回复[ 7次 ]   点击[ 368次 ]  
cutebe
[帖 主]   [ 发表时间:2013-06-11 16:58 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2010-01-27 19:28
P261
MOV AH,4CH
MOV AL,1        ;返回值,0和1也没有区别阿
INT 21H
linyu0723
[第1楼]   [ 回复时间:2013-06-20 22:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
这个范围很广,不同子程序的返回值有着不同的意义,在你这几条指令里,你看不出来什么,甚至你完全可以去掉mov al,1这句指令,指令完全能正常执行。但有时需要。每个子程序都有一定的功能,C语言为例,如下面的fun()子程序的功能是计算两个数之后,当主调函数调用fun()子程序后,需要得到计算后的结果,这个结果就需要fun()子程序返回。
int main()
{
int a;
int b;
int c;
c=fun(a,b);//主调函数main()在这里调用子程序fun(),结果赋值给c。
return(0);
}
int fun(int x,int y)//子程序fun(),功能是计算两数之后,结果用return()返回。
{
return(x+y);
}


再给你举个例子:

int main()
{
int a=5;
int b=-10;
c=fun(a,b);//主调函数main()在这里调用子程序fun(),结果赋值给c。
}
int fun(int x,int y))//子程序fun(),功能是比较两数大小,返回较大值,结果用return()返回。
{
if(x>y)
return(x);
else
return(y);
}


说白了,汇编里的中断,和高级语言里的子程序、WINDOWS里的API一样,供其他程序调用而已。
你完全可以把mov al,1这句换成mov al,100,或者干脆不要,仅凭你写的这几条指令,还看不出有什么意义。
linyu0723
[第2楼]   [ 回复时间:2013-06-20 22:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
补充:错误一、第一个子程序的功能是计算两数之和,打成了两数之后了。
错误二、第二个main()前面的int改void,即没有返回值。
linyu0723
[第3楼]   [ 回复时间:2013-06-20 22:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
再补充一点:如果去掉mov al,0, 说明这个程序没有返回值。
cutebe
[第4楼]   [ 回复时间:2013-06-21 08:11 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2010-01-27 19:28
不好意思C语言看不懂,不是代码,是在这里的涵义。
“供其他程序调用”说得很棒,就是想知道其他程序怎么使用这个返回值!

“如果去掉mov al,0, 说明这个程序没有返回值。”这个说法不对吧。AL任何时候都有值,不是0就是其他的。
去掉后只是变成程序自动运行后的值,而不是理想的设定值了
linyu0723
[第5楼]   [ 回复时间:2013-06-21 10:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
以P253页13.2的例子给你解释:
assume cs:code
   code segment
   start:mov ax,3456
             int 7CH   ;调用中断7CH的中断例程,计算ax中的数据的平方
             add ax,ax
             adc dx,dx
             mov ax,4c00h
             int 21h
    code ends
end start

在这个程序里,使用中断7CH计算了AX的平方,结果放在了DX和AX中(DX存放高16位,AX存放低16位),也就是说,调用7CH中断例程后,返回值被放在了DX和AX中,所以,当7CH中断执行完毕后,返回程序继续向下执行,我们的主调函数使用了7CH中断的返回值,即add ax,ax
                               adc dx,dx

不知道以上的答案是否能解开“就是想知道其他程序怎么使用这个返回值!”的疑问。
linyu0723
[第6楼]   [ 回复时间:2013-06-21 11:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
再为你解释第二个疑问,即mov al,0, 说明这个程序没有返回值。

很多情况下,我们使用mov ax,4c00h int 21h来结束一个程序。分开来讲,就是你所写的
mov ah,4ch 
mov al,1
int 21h

mov ah,4ch如书上所讲,是调用21H号中断中的子例程,这个我就不再解释了。
假如有一程序P,程序P的结尾有三行上面所说的三行指令:
程序P如下:

assume cs:code
code  segment

    ......    ; 中间的指令省略。
    ......

    mov ah,4ch 
    mov al,1
    int 21h

code ends

end




那么mov al,1是返回值,这点你也知道。但你知道谁去接收和使用这个返回值吗?答案是调用程序P的那个程序;调用P的哪个程序是谁?答案是我们的系统,也即DOS。每个被DOS所调用的程序必须返回给DOS一个整型值,这是DOS要求的。一定要注意我所说的“返回给DOS一个整型值”,所以,你可以给DOS返回任何整型值,也就是说mov al,1这条指令中的数值1,也可被换成0-FFH中的任何一个整型值,不信你可以去试试。既然可以是任意值,那么al有值就行,所以,我们可以在程序的结尾省略掉mov al,1这条指令,但DOS仍然会去检测al中的值是不是为一个整数,当然,无论如何al肯定有值,即使里面是空的,那他里面的数也是为0.所以,在程序P里的结尾写上mov al,1这条指令,其意义就是返回给DOS一个整数值。为了保持良好的编程习惯,我们需要把mov al,1这条指令给予明确的指出,也使得别人能读懂我们的程序。
反过来讲,如果DOS调用其他程序时,不需要返回值,那你在程序P的结尾即使写上mov al,1这条指令,也没有任何返回的意义,因为DOS不需要,充其量,在程序P中,mov al,1只能被看作一条普通得不能再普通的汇编指令而已。
cutebe
[第7楼]   [ 回复时间:2013-06-24 08:57 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2010-01-27 19:28
“返回给调用她的程序,即DOS” 这句太棒了。
也根据这点找了AL返回的数值最后可以怎么用了
DOS 中的ERRORLEVEL
WIN CMD中可用ERRORLEVEL 或者%ERRORLEVEL%

最后谢谢linyu0723 这么耐心的给出解释,谢谢!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved