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

8086 汇编语言:字符串小寫轉大寫完整實現與錯誤修正

     編輯:程式設計綜合問答

題目要求

輸入以 0 結尾的字符串,將其中小寫字母轉大寫輸出,非字母字符原樣輸出。

原代碼錯誤分析

  • 輸出邏輯中 PUSH DS / POP DS 破壞段寄存器,導致後續訪問錯誤。
  • INT 21H AH=2 輸出字符後未正確循環判斷結束條件。
  • 標號 N: 與 BEGIN: 跳轉邏輯混亂。
  • 未處理字符串結束符 0 (應為 '$' 或 0 視調用約定)。

修正後完整代碼 (MASM/TASM 兼容)

DATA SEGMENT
    STR1 DB 'iamAstudent', 0      ; 以 0 結尾
    PROMPT DB 'Result: $'
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE, DS:DATA
START:
    MOV AX, DATA
    MOV DS, AX
    MOV ES, AX          ; 顯示設置 ES=DS

    LEA SI, STR1        ; SI 指向字符串
    LEA DX, PROMPT
    MOV AH, 09H
    INT 21H             ; 顯示提示

NEXT_CHAR:
    MOV AL, [SI]        ; 讀取字符
    INC SI
    CMP AL, 0           ; 遇到 0 結束
    JE EXIT

    CMP AL, 'a'
    JB PRINT_CHAR       ; 小於 'a' 直接輸出
    CMP AL, 'z'
    JA PRINT_CHAR       ; 大於 'z' 直接輸出
    SUB AL, 20H         ; 小寫轉大寫 (a=61H, A=41H, 差 20H)

PRINT_CHAR:
    MOV DL, AL
    MOV AH, 02H
    INT 21H             ; 輸出字符
    JMP NEXT_CHAR

EXIT:
    MOV AH, 4CH
    INT 21H             ; 返回 DOS
CODE ENDS
END START

關鍵修正點

原問題修正
段寄存器亂動程序開始設置 MOV ES, AX,輸出過程不再修改 DS/ES
結束判斷CMP AL, 0 / JE EXIT 統一在讀取後立即判斷
轉換邏輯SUB AL, 20H 只有在 'a'..'z' 範圍內執行
輸出調用統一用 MOV DL, AL / MOV AH, 02H / INT 21H
循環結構單一入口 NEXT_CHAR:,清晰無雜亂跳轉

運行結果

Result: IAMASTUDENT

擴展:處理任意長度輸入 (鍵盤輸入)

INPUT_LOOP:
    MOV AH, 01H         ; 帶回顯輸入
    INT 21H             ; AL = 輸入字符
    CMP AL, 0DH         ; 回車鍵結束
    JE PROCESS
    MOV [SI], AL
    INC SI
    JMP INPUT_LOOP

PROCESS:
    MOV BYTE PTR [SI], 0 ; 添加結束符 0
    ; 接上述轉換輸出邏輯

調試技巧 (MASM + DOSBox)

  1. 用 DEBUG 或 TD (Turbo Debugger) 單步跟蹤 SI、AL、FLAGS。
  2. 設置斷點在 INT 21H 觀察輸出。
  3. 檢查內存 DS:SI 確認字符串正確存放。

總結

彙編語言核心:**寄存器管理規範**、**循環結構清晰**、**段地址正確**。本例通過統一讀取-判斷-轉換-輸出流程,修復了原代碼的段寄存器破壞與邏輯跳轉混亂。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved