; 统一规定:
; 1,数据段(data),代码段(code),堆栈段(stack),
; 2,过程间传递参数用(si)寄存器
; 3,mov 用于取数据,lea用于取地址,不用mov + offset 的形式
;
data segment
msg_str db 0ah, 0dh,"it's just a simple echo program('q' to exit)",0ah, 0dh, "$"
msg_in db "input:$"
msg_out db "output:$"
;数据输入缓冲区
buffer equ this byte
maxLen db 0ffH ; 最大输入长度
realLen db ? ; 实际输入长度
inputData db 1024 dup('$') ; 数据区
END_CHAR db '$'
data ends
stack segment stack
db 512 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
call initXS
lea si, msg_str
call outMsg
call outLine;
_for:
lea si, msg_in
call outMsg ; 输入提示
lea si, buffer
call inputString ; 输入字符串
call outLine
;当输入‘q’加上回车时,就退出,而以‘q’开头的字符串不结束
cmp inputData, 'q' ; 判断第一个是否是‘q'
lahf ; 判断的结果保存在ah中
mov al, ah ; 将结果转移到al中,让出ah便于保存下一个比较结果
lea bx, inputData ; 数据的基址
mov dl,[bx+1] ; 获取第二个输入字符
cmp dl,0dh ; 比较第二个
lahf
and ah,al ; 两个同时满足是退出
sahf
je exit ; 两个同时满足是退出
lea bx, inputData ; 数据的基址
mov al, realLen ; 取输入数据长度
mov ah, 0 ; 屏蔽高位
mov di, ax ; 准备变址寻址方式的目的地址
mov al, END_CHAR
mov [bx+di], al
lea si, msg_out
call outMsg ; 输出提示
lea si, inputData
call outMsg ; 输出
call outLine;
call outLine;
jmp _for ; 循环(这是无限循环)
exit:
mov ah,4ch
int 21H
code ends
tool segment
initXS proc far
mov ax, data ;初始化数据段(所以数据段都使用(data)的名字)
mov ds, ax
mov ax, stack ;初始化数据段(所以数据段都使用(stack)的名字)
mov ss, ax
ret
initXS endp
outLine proc far
mov ah, 2H
mov dl, 0aH
int 21H
mov dl, 0dH
int 21H
ret
outLine endp
outMsg proc far
mov ah, 9H
mov dx, si
int 21H
ret
outMsg endp
inputString proc far
mov dx, si
mov ah, 0aH ; 输入
int 21H
ret
inputString endp
outDigit proc far
mov ah, 2h
mov dx, si
add dl, '0'
int 21H
ret
outDigit endp
outChar proc far
mov dx, si
mov ah, 2H
int 21H
ret
outChar endp
tool ends
end start