有些匯編程式答案里面沒有定義 STACK SEGMENT
而有些程式答案里面卻定義了
去網上搜索(得到的答案不盡人意-->有些說是呼叫int n時需要定義堆疊段,問題是有些題呼叫了int n卻沒有定義堆疊段,所以就很懵逼)
比如說這個題:
編程實作將鍵盤連續輸入的小寫字母用大寫字母顯示出來,中間用'-'分隔,當輸入非小寫字母時程式停止處理
參考答案:
STACK SEGMENT STACK ;定義堆疊段
DB 100DUP(?) ;開辟 100 個存盤單元
STACK ENDS ;堆疊段結束
CODE SEGMENT ;定義代碼段
ASSUME CS:CODE,SS:STACK
START: MOV AH,01H ;1 號呼叫,從鍵盤輸入一字符存入 AL
INT 21H ;輸入并回顯
MOV BL,AL ;保存從鍵盤輸入字符
CMP AL,’a’ ;與“a”的 ASCII 碼比較
JB L3 ;低于“a”的 ASCII 碼,轉 L3(退出)。
CMP AL,’z’ ;與“z”的 ASCII 碼比較
JA L3 ;高于“a”的 ASCII 碼,轉 L3(退出)。
SUB AL,20H ;將 AL 中字符的 ASCII 碼減去 20H 變成大寫字母。
MOV BL,AL ;保存結果
MOV DL,‘-’ ;顯示字符‘-’送 DL
MOV AH,02H ;2 號呼叫,在顯示幕上顯示字符‘-’。
INT 21H ;顯示‘-’
MOV DL,BL ;結果(大寫字母)送 DL。
MOV AH,02H ;2 號呼叫,在顯示幕上顯示 DL 中的內容(大寫字母)。
INT 21H ;顯示大寫字母
MOV DL,20H ;空格送 DL。()
MOV AH,02H ;2號呼叫,在顯示幕上顯示DL中的內容(大寫字母) 。
INT 21H ;顯示空格(使兩結果用空格隔開)
JMP START ;不是“回車符”,轉 START(繼續)
L3: MOV AH,4CH ;是“回車符”,設定回傳 DOS 功能碼。
INT 21H ;回傳 DOS
CODE ENDS ;代碼段結束
END START ;程式匯編結柬
所以到底什么情況下需要定義STACK SEGMENT
uj5u.com熱心網友回復:
抱歉了,因為著急,答案的縮進沒有設定好,sorry~~~~~~~~~~uj5u.com熱心網友回復:
一般的小程式,不對記憶體有管理要求的,不需要設定堆疊,因為 dos16環境有個默認堆疊的設定,就是在程式所在 64K段的末尾,你用 debug加載個不設堆疊段的程式后,看看 ss:sp 的指向就知道了。程式小,又沒有記憶體方面操作(釋放、重新申請等),這部分記憶體就不會被影響到,所以可以給堆疊使用。如果自己設定了堆疊段,就要給大些,有些示例代碼自己一堆的 push指令,堆疊卻只給 16位元組,無疑是自尋煩惱;實際會用到多少,可以運行下,在程式結束前停下來看看堆疊區有多少被使用過。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/159660.html
標籤:匯編語言
上一篇:線性表的論述(Java版)
