DATAS SEGMENT ;segment和ends是成對使用的偽指令,功能是定義一個段,這是在寫可被編譯器編譯的組譯工具時
;必須使用的,sement是段的開始,ends是結束
buf1 DB "Hello, $"
BBB DB 31 ;表示緩衝區能容31個字元
DB ?
DB 31 DUP (?) ;這裡的31是你在資料區段開闢的空間,? 表示不對分配的儲存單元賦初值
;db :定義位元組類型變數的偽指令
;dup():重複定義圓括弧中指定的初值,次數由前面的數值決定
;?:只分配儲存空間,不指定初值
;CRLF DB 0AH,0DH,"$"; 斷行符號換行
DATAS ENDS
STACKS SEGMENT
DB 200 DUP(?) ;此處輸入堆棧段代碼
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;在程式中段名就相當於一個標號,它代表了段地址,該句是把名稱為"DATAS"的段的段地址送入ax
;不能直接用mov ds,datas。因為程式中對段名的引用,如mov ds,datas中的datas被編譯器處理為一個表示段地址的數值
;而8086CPU不允許將一個數值直接送到段寄存器,所以要先把datas送到ax,然後再把ax送到ds
START: MOV AX,DATAS
MOV DS,AX
;INT 21H是命令系統工作的意思,至於做什麼工作,就看你往AH裡面放了什麼代碼。
;LEA指令的功能是將源運算元、即儲存單元的有效地址(位移地址)傳送到目的運算元。
MOV AH,10 ;10號中斷,接收輸入字串,此時dx為存放字串的有效地址
LEA DX,BBB
INT 21H
;下面三行是輸出"Hello,"
LEA DX,[buf1] ;9號中斷前提,給參數dx賦值,指定輸出字串所在的有效地址
MOV AH,9
INT 21H
;下面三行是斷行符號換行
; LEA DX,CRLF
; MOV AH,9
; INT 21H
;CL:在移位指令和迴圈移動指令中,存放移位次數或者迴圈移位次數。
; SI:在儲存空間定址時,作為變址寄存器。在串操作中,作為源串指標?
; SI是十六位的,它不像ax,bx,cx,dx那樣可以分為高八位,底八位,所以用mov dl,si和 mov dl,byte ptr si都是錯誤的
;直接用mov dx,si就行了,這時dx中的dl已經得到了你所要的結果
MOV CL,BBB+1 ;擷取字串中字元的個數
LEA SI,BBB+2 ;首地址 間接定址
NEXT: MOV DX,[SI] ;以SI中的內容為位移地址,把該地址送到dx
MOV AH,2 ;2號中斷輸出單個字元
INT 21H
INC SI ;輸出一個地址後加1
DEC CL ;順便減少輸出的次數
JNZ NEXT ; 此處輸入程式碼片段代碼
; 把2號調用改為9號調用
; MOV BL,CL
; MOV [SI+BX],'$'
; MOV DX,SI
; MOV AH,9
; INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START