汇编--- echo 程序

; 统一规定:
; 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值