|
主题 : : INT 21H的返回值有什么用? [待解决] |
回复[ 7次 ]
点击[ 368次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2013-06-11 16:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2010-01-27 19:28 |
P261
MOV AH,4CH
MOV AL,1 ;返回值,0和1也没有区别阿
INT 21H | | |
|
|
|
|
[第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,或者干脆不要,仅凭你写的这几条指令,还看不出有什么意义。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2013-06-20 22:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54 |
补充:错误一、第一个子程序的功能是计算两数之和,打成了两数之后了。
错误二、第二个main()前面的int改void,即没有返回值。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2013-06-20 22:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54 |
再补充一点:如果去掉mov al,0, 说明这个程序没有返回值。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2013-06-21 08:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2010-01-27 19:28 |
不好意思C语言看不懂,不是代码,是在这里的涵义。
“供其他程序调用”说得很棒,就是想知道其他程序怎么使用这个返回值!
“如果去掉mov al,0, 说明这个程序没有返回值。”这个说法不对吧。AL任何时候都有值,不是0就是其他的。
去掉后只是变成程序自动运行后的值,而不是理想的设定值了 | | |
|
|
|
|
[第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
不知道以上的答案是否能解开“就是想知道其他程序怎么使用这个返回值!”的疑问。 | | |
|
|
|
|
[第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只能被看作一条普通得不能再普通的汇编指令而已。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2013-06-24 08:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2010-01-27 19:28 |
“返回给调用她的程序,即DOS” 这句太棒了。
也根据这点找了AL返回的数值最后可以怎么用了
DOS 中的ERRORLEVEL
WIN CMD中可用ERRORLEVEL 或者%ERRORLEVEL%
最后谢谢linyu0723 这么耐心的给出解释,谢谢! | | |