回 帖 发 新 帖 刷新版面

主题:一个子程序的出错,谁能指点一下

程序是通过堆栈来传递参数buf的首地址和数组的数count,本程序的结果是将数组的各数相加,并存在result中,我为了验证结果的正确与否,加了一个输出语句,应该在屏幕上输出 2 ,但是屏幕什么也没有,谁能给我看看错在什么地方了,实在是整不出来了


data          SEGMENT
buf           DB        4,5,6,7,8
count         EQU        $-buf
result        DW        ?
data          ENDS
              
stack         SEGMENT  
              DB        20 DUP(?)
stack         ENDS
              
code          SEGMENT
              ASSUME    CS:code,DS:data,SS:stack
main          PROC      FAR
start:        
              MOV       AX,data
              MOV       DS,AX
              MOV       AX,stack
              MOV       SS,AX
              MOV       BX,OFFSET buf
              MOV       CX,count
              PUSH      BX
              PUSH      CX
              CALL      compute
              RET
              ADD       DL,14h
              MOV       AH,2
              INT       21h
            
              MOV       AH,4ch
              INT       21h
          
              
main          ENDP
              
compute       PROC      NEAR
              POP       AX
              POP       CX
              POP       BX
              MOV       DX,0             
              MOV       SI,0
LOOP1:        
              ADD       DL,[BX+SI]
              INC       SI
              LOOP      LOOP1
              MOV       result,DX
              PUSH      AX
              RET
compute       ENDP
code          ENDS
              END       main

回复列表 (共1个回复)

沙发

PUSH      BX
PUSH      CX //一般是变量(不是寄存器)参数入栈,然后用通过sp的值来读取参数 
CALL      compute //也免得你手动保存和恢复 ip,而和 结尾ret的作用 重复了
-----------------------------------
;帮你注释掉了多余的代码,并加了以暂停的代码。
data          SEGMENT
buf           DB        4,5,6,7,8
count         EQU        $-buf
result        DW        ?
data          ENDS
              
stack         SEGMENT  
              DB        20 DUP(?)
stack         ENDS
              
code          SEGMENT
              ASSUME    CS:code,DS:data,SS:stack
main          PROC      FAR
start:        
              MOV       AX,data
              MOV       DS,AX
              MOV       AX,stack
              MOV       SS,AX
              MOV       BX,OFFSET buf
              MOV       CX,count
                  ;PUSH      BX
                  ;PUSH      CX
              CALL      compute
                  ; RET
              ADD       DL,14h
              MOV       AH,2
              INT       21h
            
            mov ah,1;暂停
            int 21h ;任意键关闭

              MOV       AH,4ch
              INT       21h
                       
main          ENDP
              
compute       PROC      NEAR
                 ;POP       AX
                 ;POP       CX
                 ; POP       BX
              MOV       DX,0             
              MOV       SI,0
LOOP1:        
              ADD       DL,[BX+SI]
              INC       SI
              LOOP      LOOP1
                 ;MOV       result,DX
                 ;PUSH      AX
              RET
compute       ENDP
code          ENDS
              END       main

我来回复

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