回 帖 发 新 帖 刷新版面

主题:还是郁闷啊

今天遇到了一个问题,一直没解决啊,很简单,就是

ret 和

mov ax,4c00h

int 21h

的区别啊,我问了很多人,他们都说是一样的只不过前者返回过程,后者是直接返回 dos

但我在做一个题时遇到问题觉得他们说的都不准确啊,请看:

DATA SEGMENT
MESG1 db 0DH,0AH,'FOUND$'
MESG2 Db 0DH,0AH,'NO FOUND$'
MESG3 Db 'ENTER KEYWORD:$'
BUFFER  DW  3213,5128,57826,7632,1387
        DW  45321,928,9876,1899,45678
COUNT dw 10
ADDR  DW   0
DATA ENDS
CODE SEGMENT
  ASSUME  CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MESG3
INT 21H
CALL  DECIBIN
MOV  AX,BX
MOV   DI,OFFSET BUFFER
MOV  CX,COUNT
NEXT:     CMP AX,[DI]
          JE  OK
          ADD  DI,2
          LOOP  NEXT
          MOV ADDR,-1
          MOV  DX,OFFSET  MESG2
          JMP   SHORT DISPLAY
OK:       MOV  ADDR,DI
          MOV   DX,OFFSET MESG

DISPLAY:  

            MOV   AH,9
          INT   21H
          mov ax,4c00h

          int 21h

DECIBIN   PROC   NEAR
MOV   BX,0
NEWCHAR:    MOV    AH,1
INT    21H
SUB  AL,30H
JL    EXIT
CMP  AL,9
JG   EXIT
CBW
XCHG   AX,BX
MOV   CX,10
MUL   CX
XCHG   AX,BX
ADD   BX,AX
JMP   NEWCHAR
EXIT:       RET
DECIBIN  ENDP
CODE  ENDS
         END START
这个程序完成从键盘输入的一个数,然后查找,找到显示found 否则显示no found

这个程序没有主过程,显示正确,我把上面mov ax,4c00h   int  21h 去掉,加上主过程,即:加上 

DATA SEGMENT
MESG1 db 0DH,0AH,'FOUND$'
MESG2 Db 0DH,0AH,'NO FOUND$'
MESG3 Db 'ENTER KEYWORD:$'
BUFFER  DW  3213,5128,57826,7632,1387
        DW  45321,928,9876,1899,45678
COUNT dw 10
ADDR  DW   0
DATA ENDS
 CODE SEGMENT

main proc far                         ;主过程

回复列表 (共3个回复)

沙发


不好意思,上面发少了,看下面:

今天遇到了一个问题,一直没解决啊,很简单,就是

ret 和

mov ax,4c00h

int 21h

的区别啊,我问了很多人,他们都说是一样的只不过前者返回过程,后者是直接返回 dos

但我在做一个题时遇到问题觉得他们说的都不准确啊,请看:

DATA SEGMENT
MESG1 db 0DH,0AH,'FOUND$'
MESG2 Db 0DH,0AH,'NO FOUND$'
MESG3 Db 'ENTER KEYWORD:$'
BUFFER  DW  3213,5128,57826,7632,1387
        DW  45321,928,9876,1899,45678
COUNT dw 10
ADDR  DW   0
DATA ENDS
CODE SEGMENT
  ASSUME  CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MESG3
INT 21H
CALL  DECIBIN
MOV  AX,BX
MOV   DI,OFFSET BUFFER
MOV  CX,COUNT
NEXT:     CMP AX,[DI]
          JE  OK
          ADD  DI,2
          LOOP  NEXT
          MOV ADDR,-1
          MOV  DX,OFFSET  MESG2
          JMP   SHORT DISPLAY
OK:       MOV  ADDR,DI
          MOV   DX,OFFSET MESG

DISPLAY:  

            MOV   AH,9
          INT   21H
          mov ax,4c00h

          int 21h

DECIBIN   PROC   NEAR
MOV   BX,0
NEWCHAR:    MOV    AH,1
INT    21H
SUB  AL,30H
JL    EXIT
CMP  AL,9
JG   EXIT
CBW
XCHG   AX,BX
MOV   CX,10
MUL   CX
XCHG   AX,BX
ADD   BX,AX
JMP   NEWCHAR
EXIT:       RET
DECIBIN  ENDP
CODE  ENDS
         END START
这个程序完成从键盘输入的一个数,然后查找,找到显示found 否则显示no found

这个程序没有主过程,显示正确,我把上面mov ax,4c00h   int  21h 去掉,加上主过程,即:加上 

DATA SEGMENT
MESG1 db 0DH,0AH,'FOUND$'
MESG2 Db 0DH,0AH,'NO FOUND$'
MESG3 Db 'ENTER KEYWORD:$'
BUFFER  DW  3213,5128,57826,7632,1387
        DW  45321,928,9876,1899,45678
COUNT dw 10
ADDR  DW   0
DATA ENDS
 CODE SEGMENT

main proc far                         ;主过程

 ASSUME  CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MESG3
INT 21H
CALL  DECIBIN
MOV  AX,BX
MOV   DI,OFFSET BUFFER
MOV  CX,COUNT
NEXT:     CMP AX,[DI]
          JE  OK
          ADD  DI,2
          LOOP  NEXT
          MOV ADDR,-1
          MOV  DX,OFFSET  MESG2
          JMP   SHORT DISPLAY
OK:       MOV  ADDR,DI
          MOV   DX,OFFSET MESG

DISPLAY:  

            MOV   AH,9
          INT   21H
      ret

main endp                                        ;main 过程

DECIBIN   PROC   NEAR
MOV   BX,0
NEWCHAR:    MOV    AH,1
INT    21H
SUB  AL,30H
JL    EXIT
CMP  AL,9
JG   EXIT
CBW
XCHG   AX,BX
MOV   CX,10
MUL   CX
XCHG   AX,BX
ADD   BX,AX
JMP   NEWCHAR
EXIT:       RET
DECIBIN  ENDP
CODE  ENDS
         END START
上面却不能输出,只有输入,如果一样为什么不对啊,我郁闷了好几天了,谁能解答啊

 

板凳

ret 是返回到调用当前子程序的上级程序

mov ax,4c00h和int 21h是结束程序,回到DOS操作系统的。

按照你上述的修改,RET只是结束了MAIN程序,而没有结束当前的可执行程序(假设为F0.EXE),要想结束可执行程序,回到操作系统界面,必须用mov ax,4c00h和int 21h
,RET没有这个功能。

3 楼

补充说明一下,就是一个proc中,ret是用来回到某个call调用它的地方继续执行。
显然没有什么地方call你的main。

[SP1]NND,中文夹英语真别扭。

我来回复

您尚未登录,请登录后再回复。点此登录或注册