已知有幾個數據存放在BUF為首址的字節存儲區中,試統計其中正數的個數,并將結果存入ZNUM單元中。
P160
例4.17
匯編思路:DATA段,定義BUF存儲區,定義一下DB類型的數據,N為定義數據的總個數,ZNUM用于存放最后的正數個數。STACK段,開辟一段大小為100DB的堆棧段的存儲空間,用于進行運算。CODE段,首先讓BX獲取到BUF的有效地址,CX獲取到N的值,用于循環,對AX清零,目的用于記錄正數個數,然后,將BX的內容以次與0相比較,若結果為>=0(通過JLE判斷),AX自加,否則BX自加,如果通過LOOP跳回到上一步再次進行下一個數據的判斷,直到最后CX的值為0結束,然后再將AX統計到的正數的個數賦值給ZNUM,然后調用4CH號功能,返回DOS系統,程序結束。
代碼如下:
DATA SEGMENT
BUF DB 3,5,2,7,0,-1,-7,9,-4,8;隨機的幾個存放在BUF為首址的一些數據
N EQU $-BUF ;N表示數據的總個數
ZNUM DW ? ;ZNUM用于存放最后的統計個數
DATA ENDS
STACK SEGMENT STACKDB 100 DUP(?);在堆棧段開辟了一段100DB大小的用于運算的存儲空間
STACK ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATAMOV DS,AX LEA BX,BUF ;去有效地址指令LEA,將BUF的地址賦值給BXMOV CX,N ;CX存放數據的總個數,用于循環使用XOR AX,AX ;AX清零,用于存放正數的個數
L1: CMP BYTE PTR[BX],0;存儲器操作數需要使用修改屬性運算符PTR來指定位于其后的存儲器操作數的類型為BYTE類型,判斷數據是否為0JLE L2 ;JLE小于或等于轉移,即若上條指令結果<=0,跳轉到L2標簽處,否則執行下一條指令 即>0執行下一條指令,<=0跳轉到L2標簽處INC AX ;若執行到此條指令,表示數據為正數,AX自加
L2: INC BX ;BX+1,即操作進行判斷下一個數據LOOP L1 ;無條件跳轉到L1標簽處,CX-1,再次跳轉到L1標簽處時,由于BX已經+1,此時再判斷的就是下一個數據了,直到CX的值為0,即所有數據已經都判斷完畢之后結束循環MOV ZNUM,AX ;將AX用于存放整數的個數賦值給ZNUMMOV AH,4CH ;調用4CH號功能,返回DOS操作系統INT 21H ;終止當前程序的運行,并返回DOS系統
CODE ENDSEND START