首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

匯編語言子程序調用與返回:CALL/RET指令與棧機制

     編輯:程式設計綜合問答

題目要求

  • 子程序:執行回車換行(輸出0Dh, 0Ah)。
  • 主程序:鍵盤輸入字符串 → 調用子程序換行 → 輸入單字符 → 調用子程序換行 → 用字符截斷字符串 → 顯示結果。

核心指令

完整代碼框架

DATA SEGMENT
    STR1 DB 100 DUP(0)  ; 字符串緩衲區
    CHAR DB ?           ; 截斷字符
    PROMPT1 DB 'Input string: $'
    PROMPT2 DB 'Input char: $'
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE, DS:DATA
START:
    MOV AX, DATA
    MOV DS, AX
    
    ; 輸入字符串
    LEA DX, PROMPT1
    MOV AH, 09H
    INT 21H
    LEA DX, STR1
    MOV AH, 0AH       ; 帶緩衲區輸入
    INT 21H
    
    CALL NEWLINE      ; 調用換行子程序
    
    ; 輸入字符
    LEA DX, PROMPT2
    MOV AH, 09H
    INT 21H
    MOV AH, 01H       ; 單字符輸入
    INT 21H
    MOV CHAR, AL
    
    CALL NEWLINE
    
    ; 截斷處理:掃描STR1+2開始,遇CHAR替換為'$'並跳出
    LEA SI, STR1+2
SCAN:
    MOV AL, [SI]
    CMP AL, '$'       ; DOS字符串以$結尾
    JE DISPLAY
    CMP AL, CHAR
    JNE NEXT
    MOV BYTE PTR [SI], '$' ; 截斷
    JMP DISPLAY
NEXT:
    INC SI
    JMP SCAN

DISPLAY:
    LEA DX, STR1+2    ; 顯示處理後字符串
    MOV AH, 09H
    INT 21H
    
    MOV AH, 4CH
    INT 21H

; 子程序:換行
NEWLINE PROC
    MOV AH, 02H
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H
    RET
NEWLINE ENDP

CODE ENDS
    END START

關鍵點說明

  1. INT 21H, AH=0AH輸入字符串到緩衲區,格式:[最大長度][實際長度][字符...],故數據從STR1+2開始。
  2. 子程序NEWLINE保護現場(本例未用通用寄存器可不保護),複雜子程序需PUSH/POP保護AX, BX, CX, DX, SI, DI, BP等。
  3. 截斷邏輯:遍歷字符串,匹配CHAR則覆寫為'$'(DOS顯示終止符)。

調試建議

  • 使用DEBUG或MASM+Link編譯鏈接,生成.exe。
  • 單步執行觀察SI掃描過程、棧指針SP變化。
  • 驗證輸入abcdef、字符d → 輸出abc。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
指令作用棧變化
CALL 子程序標號壓入下一條指令地址(IP),跳轉到子程序SP-2, [SS:SP]=IP
RET彈出棧頂地址到IP,返回調用處繼續執行IP=[SS:SP], SP+2