# 匯編基礎中int 21h中斷例程中的9號子程序怎樣實現hello world
## 引言
在x86匯編語言中,DOS系統調用通過`int 21h`中斷提供了豐富的功能。其中**9號子程序(AH=09h)**專門用于字符串輸出,是初學者實現"Hello World"程序的經典方式。本文將詳細解析其實現原理、參數設置及完整代碼示例。
## 一、int 21h與9號子程序基礎
### 1. 中斷調用機制
`int 21h`是DOS的系統功能調用中斷,通過設置AH寄存器選擇子功能號。調用時CPU會:
1. 查找中斷向量表
2. 跳轉到對應中斷處理程序
3. 根據AH值執行特定功能
### 2. 9號子程序功能說明
- **功能號**:AH=09h
- **作用**:輸出以'$'結尾的字符串
- **輸入參數**:
- DS:DX → 字符串首地址
- **注意事項**:
- 字符串必須以'$'(ASCII碼24h)結尾
- 自動處理回車(0Dh)、換行(0Ah)等控制字符
## 二、實現Hello World的完整流程
### 1. 數據段定義
```assembly
data segment
msg db 'Hello, World!', 0Dh, 0Ah, '$' ; 0Dh,0Ah表示回車換行
data ends
code segment
assume cs:code, ds:data
start:
mov ax, data ; 初始化數據段
mov ds, ax
mov dx, offset msg ; DX=字符串偏移地址
mov ah, 09h ; 設置功能號
int 21h ; 調用DOS中斷
mov ah, 4Ch ; 程序結束功能
int 21h
code ends
end start
mov ds, ax
:DS需通過AX間接賦值offset msg
:獲取msg的偏移地址(相對于DS)int 21h
:觸發系統調用; 錯誤寫法(無$結尾) error db ‘Invalid’
### 2. 地址加載原理
- **DS:DX結構**:
- DS(Data Segment):數據段基址
- DX:字符串在段內的偏移量
- 實模式下采用段地址×16+偏移的尋址方式
### 3. 與其他輸出方式的對比
| 方法 | 功能號 | 特點 |
|---------------|--------|-----------------------|
| 單字符輸出 | AH=02h | 需循環輸出每個字符 |
| 字符串輸出 | AH=09h | 需'$'結尾,批量輸出 |
| 控制臺輸出 | AH=40h | 需文件句柄(BX=1) |
## 四、常見問題解決方案
### 1. 字符串未顯示
- **檢查點**:
1. 確認DS正確初始化
2. 驗證字符串以'$'結尾
3. 檢查DX是否指向正確偏移
### 2. 輸出亂碼
- **可能原因**:
- 字符串未正確終止
- DS段寄存器設置錯誤
- 數據段定義未被正確識別
### 3. 跨行輸出技巧
```assembly
multi_line db 'Line1', 0Dh, 0Ah, 'Line2$'
運行環境:
調試建議:
通過int 21h
的9號子程序實現字符串輸出,是學習匯編語言的重要實踐。掌握該功能后,可進一步探索:
- 結合01h功能實現輸入輸出交互
- 開發更復雜的DOS應用程序
- 理解操作系統API的底層原理
附錄:完整可編譯代碼(MASM格式)
.model small
.stack 100h
.data
hello db 'Hello, World!', 0Dh, 0Ah, '$'
.code
main proc
mov ax, @data
mov ds, ax
lea dx, hello
mov ah, 09h
int 21h
mov ah, 4Ch
int 21h
main endp
end main
”`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。