| 指令 | 作用 | 棧變化 |
CALL 子程序標號 | 壓入下一條指令地址(IP),跳轉到子程序 | SP-2, [SS:SP]=IP |
RET | 彈出棧頂地址到IP,返回調用處繼續執行 | IP=[SS:SP], SP+2 |
完整代碼框架
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
關鍵點說明
INT 21H, AH=0AH輸入字符串到緩衲區,格式:[最大長度][實際長度][字符...],故數據從STR1+2開始。
- 子程序
NEWLINE保護現場(本例未用通用寄存器可不保護),複雜子程序需PUSH/POP保護AX, BX, CX, DX, SI, DI, BP等。
- 截斷邏輯:遍歷字符串,匹配
CHAR則覆寫為'$'(DOS顯示終止符)。
調試建議
- 使用
DEBUG或MASM+Link編譯鏈接,生成.exe。
- 單步執行觀察
SI掃描過程、棧指針SP變化。
- 驗證輸入
abcdef、字符d → 輸出abc。
- 上一篇文章: Java判斷素數方法:試除法優化至√n與邊界處理
- 下一篇文章: 匯編語言循環顯示寄存器值:二進制與十六進制輸出實現
Copyright ©
程式碼之家 All Rights Reserved