https://blog.csdn.net/NK_test/article/details/46045201

汇编实现的一个简易的文本编辑器,代码中有详细的注释。
思路和细节:
(1) 在屏幕中央初始化一片面积,并且定位光标,利用16号中断0号功能分别在ah,al中存储扫描码和ascii码,由此进行功能键的判断。
(2) 实现对光标的操作,通过对dh,dl的变化和10号中断的2号功能进行光标的设置,上下左右分别改变dh,dl的值即可。
(3)退格键的操作实现是 光标左移,然后利用21号中断输出空格即可实现删除操作。
(4)下界超过某一个设定的值后就进行上卷一行的操作,此时当前光标位置随之上移。
(5)注意边界的处理,左移到行首就贴边上移,右移到行末贴边下移,上下移动注意边界,退格要一行行向上依次删除,输出字符的过程中
超过宽度自动换行,这些都是要处理的细节问题。
(6)注意保护dx和ax的值(压入栈中)

; by Tach

data segment
    Esc_key equ 1bh ;退出
    win_ulc equ 30 ;左列
    win_ulr equ 8   ;上行
    win_lrc equ 50   ;右列
    win_lrr equ 16   ;下行
    win_width equ 20  ;宽度
    board_shift equ 48h  ;光标上移
    board_down equ 50h   ;光标下移
    board_left equ 4Bh   ;光标左移
    board_right equ 4Dh  ;光标右移
    board_back equ 08h   ;退格键 
    string db "Tach's notepad!$"
    
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:   
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax
    
 ;----------输出标题------------------ 
    mov ah,2 
    mov dh,win_ulr-1
    mov dl,win_ulc+2 
    mov bh,0 
    int 10h 
    lea dx, string
    mov ah, 9
    int 21h        ; output string at ds:dx 
  ;-------------------------------------
 locate:
 ;-----设置光标初始位置-----------
    mov ah,2 
    mov dh,win_ulr
    mov dl,win_ulc 
    push dx
    mov bh,0 
    int 10h 
  ;--------------------------------  
  
  ;----初始化屏幕------------------
    mov ah,6  
    mov ch,win_ulr
    mov cl,win_ulc
    mov dh,win_lrr
    mov dl,win_lrc 
    
    mov bh,0F4h ;白底红字
    int 10h 
    pop dx  
   ;----------------------------
    
 get_char:
    mov ah,0   ;16h 0号功能,ah中放扫描码,al中放ascii码
    int 16h
    cmp al,0   ;if 功能键 then al=0
    je  K  
  ;-----利用ascii码判断-----------------------
    cmp al,Esc_key
    je exit
    cmp al,0dh
    je  enter 
    cmp al,board_back
    je back
    
  ;---读取当前光标位置--------------- 
    mov ah,3
    mov bh,0
    int 10h 
  ;---------------------  
    push dx   ;保护变量
    cmp dl,win_lrc   ;输入字符时是否越过右列值
    jge NK
    jmp N 
NK:  
    inc dh
    mov dl,win_ulc 
    push dx 
  ;--------------------
    mov bh,0 ;重新设置光标位置
    mov ah,2
    int 10h  
  ;-------------------
  N:
    cmp  dh,win_lrr
    jge  roll    ;是否越过下界,上卷
 Next:
    mov dl,al   ;输出输入的字符
    mov ah,2
    int 21h 
    pop dx

jmp get_char   
  ;-------对功能键(扫描码)的处理---------------
 K:  
    cmp ah,board_shift  
    jz shift 
    cmp ah,board_down
    je down 
    cmp ah,board_left
    je left
    cmp ah,board_right 
    je right   
    jmp  get_char
;-------------上卷一行---------------------
 roll:
    mov ah,6 
    push ax
    mov al,1
    mov ch,win_ulr
    mov cl,win_ulc
    mov dh,win_lrr
    mov dl,win_lrc
    mov bh,0F4h
    int 10h 
    pop ax 
    pop dx

cmp dh,win_lrr
    jbe KK 
      
    dec dh  
    
 KK:  
    dec dh   ;上卷之后,dh随之自减
    mov bh,0
    mov ah,2
    int 10h 
    push dx
    jmp Next
 ;---------------------------------
 ;---------处理换行--------------------  
 enter:
    mov ah,3
    mov bh,0
    int 10h 
    inc dh
    mov dl,win_ulc  
    mov bh,0
    mov ah,2
    int 10h
    jmp get_char
 ;--------------------------------
 ;---------光标上移-----------------------
 shift: 
    mov ah,3
    mov bh,0
    int 10h
    dec dh 
    cmp dh,win_ulr
    jge S  
    inc dh
 S:
    mov bh,0
    mov ah,2
    int 10h
    jmp get_char 
 ;------------光标下移------------------------
 down: 
    mov ah,3
    mov bh,0
    int 10h
    inc dh 
    cmp dh,win_lrr
    jbe D 
    dec dh
 D:
    mov bh,0
    mov ah,2
    int 10h
    jmp get_char
 ;------------------------------------
 ;-------------光标左移--------------------   
 left:
    mov ah,3
    mov bh,0
    int 10h
    dec dl 
    cmp dl,win_ulc
    jge L
    inc dl 
    dec dh 
    cmp dh,win_ulr
    jge L
    inc dh
 L:
    mov bh,0
    mov ah,2
    int 10h
    jmp get_char
;-----------------------------
;------------光标右移----------------- 
 right:  
    mov ah,3
    mov bh,0
    int 10h
    inc dl
    cmp dl,win_lrc
    jbe R
    dec dl 
    inc dh
    cmp dh,win_lrr 
    jbe R
    dec dh
 R:
    mov bh,0
    mov ah,2
    int 10h
    jmp get_char 
 ;-------------------------
 ;---------退格键---------------   
 back:
    mov ah,3
    mov bh,0
    int 10h 
    
    dec dl  
    cmp dl,win_ulc
    jge B
    mov dl,win_lrc
    dec dh 
    cmp dh,win_ulr
    jge B
    inc dh 
  B: 
    mov bh,0
    mov ah,2
    int 10h 
    
    push dx 
    mov dl,20h
    mov ah,2
    int 21h 
    pop dx
    
    mov bh,0
    mov ah,2
    int 10h
    
    jmp get_char 
 ;-----------退出程序------------------------  
 exit:
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start ; set entry point and stop the assembler.
————————————————

[汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)相关推荐

  1. [转][汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)

    汇编实现的一个简易的文本编辑器,代码中有详细的注释. 思路和细节: (1) 在屏幕中央初始化一片面积,并且定位光标,利用16号中断0号功能分别在ah,al中存储扫描码和ascii码,由此进行功能键的判 ...

  2. android 编辑标签,在一个文本框输入标签回车添加退格删除

    先上图:         最近产品需要一个编辑标签的页面如图所示. 需要实现可以输入标签,按回车键或逗号生成标签.并且可以移动光标删除标签,和插入标签. 并且单个标签有字符限制(英文算一个中文算两个字 ...

  3. java简单文本编译器_java -简易文本编辑器

    import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; /** * Title:java ...

  4. C语言程序设计-简易文本编辑器

    第一部分:引言 简易文本编辑器是一个面向用户的系统服务程序,广泛用于源程序的输入.删除.替换.查找.修改等一系列操作,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色,是一个比较实用的应用 ...

  5. VB顺序文件案例:简易文本编辑器

    文章目录 一.顺序文件概述 二.案例演示 - 简易文本编辑器 (一)运行效果 (二)实现步骤 1.用户界面设计 (1)创建标准EXE工程 (2)添加一个文本框 (3)添加四个按钮 (4)添加一个公用对 ...

  6. c语言课程设计文本编辑器实验报告6,C课程设计简易文本编辑器.doc

    C课程设计简易文本编辑器 目录 第一章 课程设计目的和要求1 1.1课程设计的目1 1.2 基本要求1 第二章 课程设计任务内容2 2.1 设计背景2 2.2简易文本编辑器设计内容2 第三章 详细设计 ...

  7. Java swing 简易文本编辑器

    1.介绍几个相关的网址 精通Java Swing程序设计 BeautyEye社区 2.主要功能 tab页能够关闭(快捷键:ctrl+w,鼠标点击x) JMuneItem和Button快键键的几种绑定 ...

  8. c语言实现简易文本编辑器

    本程序要求完成一个简易文本编辑器,能够完成文本的录入.编辑.删除.查找,并能够完成文件的存取. 在文本编辑软件中把用户输入的所有文本内容作为一个字符串.虽然各种文本编辑软件的功能有强弱差别,但是基本操 ...

  9. python基础项目实战-简易文本编辑器

    在这里我简单编写了文本编辑器的部分功能,还有一些没有完善,感兴趣的友友们可以自己尝试完善后面的功能.文本编辑器的基本设计: 一.界面设计 1.标题 2.菜单栏 3.文本编辑区 4.滚动条 5.鼠标快右 ...

最新文章

  1. java 进度条 不更新_java 进度条不能刷新解决方案 (已更新一次)
  2. 网络营销助力之下国内可穿戴设备市场进一步打开迎来发展机遇
  3. 天啊!我的xbox360突然不读盘了。。。
  4. 求数组最小数平均值和和值
  5. Cambridge center for social innovation
  6. 多线程进一步的理解------------线程的创建
  7. 阶跃函数卷积自己_如何看待大神/老师说“阶跃响应曲线调参并不准确”的观点?...
  8. 数据结构与算法2——数组
  9. 论文浅尝 - SWJ | 基于知识图谱和注意力图卷积神经网络的可解释零样本学习
  10. 链表头结点存在的意义
  11. 给你工资1000一天,让你在没有网络手机电脑的大山里做森林管理工作半年,你愿意吗?
  12. spring.net 对象创建 几种情况
  13. java中的时间片概念_java中常用的时间处理类TimeUtil
  14. 自动阅读专业版第九次更新---原薅羊毛专业版
  15. oracle函数整理---first_value函数
  16. 小米台灯突然自己亮了_除了彩屏和小爱,还有哪些升级?——小米手环4 NFC版...
  17. Windows10的右键菜单添加“管理员取得所有权”
  18. 关于innerText和value的区别 2020-10-21
  19. 三维空间几何变换矩阵
  20. 什么是JSP,JSP的运行原理是什么?

热门文章

  1. tidefinger(指纹识别)
  2. android改变系统语言,Android 9.0设置系统语言
  3. 二项式定理与杨辉三角
  4. NDT方法总结与公式推导
  5. 关于720vr 全景平台 全景图片制作系统 仿720云需要注意的坑 诚意贴
  6. 用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机
  7. 青少年计算机编程经验,青少年学习计算机编程前景
  8. photoshop cs3 打字不显示问题
  9. linux 桌面 v2ex,程序员:他人笑我桌面太凌乱,我笑他人看不穿
  10. java读pdf一行_java读与pdf白件的时分呈现非常