(1)要求實驗者按照原樣對源程序進行編輯,彙編後,根據TASM給出的錯誤信息對源程序進行修改,直到沒有語法錯誤爲止。然後進行鏈接,並執行相應的可執行文件。正確的執行結果是在屏幕上顯示:25+9=34。
DATA SEGMENT
SUM DB ?,?
MESG DB '25+9='
DB 0,0,'$'
N1 DB 9,0F0H
N2 DW 25
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SUM
MOV AH,N1
MOV AL,BYTE PTR N2
ADD AH,AL
MOV [BX],AH
CALL CHANG
MOV AH,9
MOV DX,OFFSET MESG
INT 21H
MOV AH,4CH
INT 21H
CHANG PROC
LAST: CMP BYTE PTR[BX],10
JC NEXT
SUB BYTE PTR[BX],10
INC BYTE PTR[BX+7]
MOV AH, BYTE PTR[BX]
JMP LAST
NEXT: MOV DX,WORD PTR SUM
ADD WORD PTR[BX+8],DX
ADD BYTE PTR[BX+7],30H
ADD BYTE PTR[BX+8],30H
RET
CHANG ENDP
CODE ENDS
END BEG
;先將25與9作加法運算,獲得(22)16,即十進制的34,不斷用34-10
每減一次,INC BYTE PTR[BX+7],最終得到34的十位。
將減後剩下的4送入BYTE PTR[BX+8]即可。
(2)從BUF單元開始存有一字符串(長度<255),編程實現統計該串字符中的ASCII碼在42H~45H之間的字符個數,並將統計結果以二進制形式顯示在屏幕上。
DATA SEGMENT
BUF DB 255
DB ?
DB 255 DUP(?)
CRLF DB 0DH,0AH,24H ;0DH就是回車 0AH就是換行 24H='$',這個就是表示你要輸入的字符串結束 CRLF是宏指令的名稱,編譯時彙編程序用宏體替換宏指令,因此執行CRLF後,光標返回下一行始格。
N DB 0 ;統計的字符數
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
MOV AH,0AH ;【功能號0AH】等待鍵入字符串,以回車結束,保存入BUF
MOV DX,OFFSET BUF
INT 21H
MOV AH,9 ;【功能號09H】 顯示字符串,響應Ctrl_C。 入口參數:DS:DX=字符串首地址,字符串必須以‘$'(即 ASCII碼24H)爲結束標誌
MOV DX,OFFSET CRLF
int 21h
MOV SI,OFFSET BUF ;si指向BUF首地址
INC SI ;指向第一個存放實際接受字符個數的字節
MOV CL,[SI] ;將實際輸入的字符的個數放入CL
MOV CH,0 ;將CH置零,相當於現在CX存放的是字符的總個數。
INC SI ;越過存放實際接受字符個數的字節,現在指向輸入字符串的實際存儲區域的首地址
JUDGE:
MOV AL,[SI] ;將第一個字符放入AL
CMP AL,42H ;如果該字符ASCII小於0x42,則跳轉到TOTAL
JB TOTAL
CMP AL,45H ;如果該字符ASCII大於0x45,則跳轉到TOTAL
JA TOTAL
INC N ;否則則字符ASCII處於0x42—0x45之間,N加一
TOTAL:
INC SI ;si指向下一個字符,循環執行LAST1
LOOP JUDGE ;循環字符的總個數次
MOV AL,N ;將統計出來符合ASCII處於0x42—0x45之間的字符個數送入AL
MOV CX,8 ;準備循環8次,以二進制形式輸出N
NEXT:
ROL AL,1 ;循環左移一次
PUSH AX ;將目前AX的值暫時入棧,在判斷完第一位,並顯示在屏幕上之後,將AX回覆,並進行下一次左移
MOV AH,2 ;【功能號02H】 顯示一個字符,響應Ctrl_C。入口參數:DL=待顯字符的ASCII碼。
JC DISPLAY_1 ;如果這一位爲1,進位則跳轉到DISPLAY_1
MOV DL,'0' ;將'0' MOVE進DL
JMP DISPLAY_0 ;跳轉到DISPLAY,默認輸出'0'
DISPLAY_1:
MOV DL,'1' ;將'1' MOVE進DL,跳轉到DISPLAY,輸出'1'
DISPLAY_0:
INT 21H
POP AX
LOOP NEXT ;循環左移共8次
MOV AH,4CH ;程序結束
INT 21H
CODE ENDS
END BEG