汇编实现的一个简易的文本编辑器,代码中有详细的注释。

思路和细节:

(1) 在屏幕中央初始化一片面积,并且定位光标,利用16号中断0号功能分别在ah,al中存储扫描码和ascii码,由此进行功能键的判断。

(2) 实现对光标的操作,通过对dh,dl的变化和10号中断的2号功能进行光标的设置,上下左右分别改变dh,dl的值即可。

(3)退格键的操作实现是 光标左移,然后利用21号中断输出空格即可实现删除操作。

(4)下界超过某一个设定的值后就进行上卷一行的操作,此时当前光标位置随之上移。

(5)注意边界的处理,左移到行首就贴边上移,右移到行末贴边下移,上下移动注意边界,退格要一行行向上依次删除,输出字符的过程中

超过宽度自动换行,这些都是要处理的细节问题。

(6)注意保护dx和ax的值(压入栈中)

 
  1. ; by Tach
  2. data segment
  3. Esc_key equ 1bh ;退出
  4. win_ulc equ 30 ;左列
  5. win_ulr equ 8 ;上行
  6. win_lrc equ 50 ;右列
  7. win_lrr equ 16 ;下行
  8. win_width equ 20 ;宽度
  9. board_shift equ 48h ;光标上移
  10. board_down equ 50h ;光标下移
  11. board_left equ 4Bh ;光标左移
  12. board_right equ 4Dh ;光标右移
  13. board_back equ 08h ;退格键
  14. string db "Tach's notepad!$"
  15. ends
  16. stack segment
  17. dw 128 dup(0)
  18. ends
  19. code segment
  20. start:
  21. ; set segment registers:
  22. mov ax, data
  23. mov ds, ax
  24. mov es, ax
  25. ;----------输出标题------------------
  26. mov ah,2
  27. mov dh,win_ulr-1
  28. mov dl,win_ulc+2
  29. mov bh,0
  30. int 10h
  31. lea dx, string
  32. mov ah, 9
  33. int 21h ; output string at ds:dx
  34. ;-------------------------------------
  35. locate:
  36. ;-----设置光标初始位置-----------
  37. mov ah,2
  38. mov dh,win_ulr
  39. mov dl,win_ulc
  40. push dx
  41. mov bh,0
  42. int 10h
  43. ;--------------------------------
  44. ;----初始化屏幕------------------
  45. mov ah,6
  46. mov ch,win_ulr
  47. mov cl,win_ulc
  48. mov dh,win_lrr
  49. mov dl,win_lrc
  50. mov bh,0F4h ;白底红字
  51. int 10h
  52. pop dx
  53. ;----------------------------
  54. get_char:
  55. mov ah,0 ;16h 0号功能,ah中放扫描码,al中放ascii码
  56. int 16h
  57. cmp al,0 ;if 功能键 then al=0
  58. je K
  59. ;-----利用ascii码判断-----------------------
  60. cmp al,Esc_key
  61. je exit
  62. cmp al,0dh
  63. je enter
  64. cmp al,board_back
  65. je back
  66. ;---读取当前光标位置---------------
  67. mov ah,3
  68. mov bh,0
  69. int 10h
  70. ;---------------------
  71. push dx ;保护变量
  72. cmp dl,win_lrc ;输入字符时是否越过右列值
  73. jge NK
  74. jmp N
  75. NK:
  76. inc dh
  77. mov dl,win_ulc
  78. push dx
  79. ;--------------------
  80. mov bh,0 ;重新设置光标位置
  81. mov ah,2
  82. int 10h
  83. ;-------------------
  84. N:
  85. cmp dh,win_lrr
  86. jge roll ;是否越过下界,上卷
  87. Next:
  88. mov dl,al ;输出输入的字符
  89. mov ah,2
  90. int 21h
  91. pop dx
  92. jmp get_char
  93. ;-------对功能键(扫描码)的处理---------------
  94. K:
  95. cmp ah,board_shift
  96. jz shift
  97. cmp ah,board_down
  98. je down
  99. cmp ah,board_left
  100. je left
  101. cmp ah,board_right
  102. je right
  103. jmp get_char
  104. ;-------------上卷一行---------------------
  105. roll:
  106. mov ah,6
  107. push ax
  108. mov al,1
  109. mov ch,win_ulr
  110. mov cl,win_ulc
  111. mov dh,win_lrr
  112. mov dl,win_lrc
  113. mov bh,0F4h
  114. int 10h
  115. pop ax
  116. pop dx
  117. cmp dh,win_lrr
  118. jbe KK
  119. dec dh
  120. KK:
  121. dec dh ;上卷之后,dh随之自减
  122. mov bh,0
  123. mov ah,2
  124. int 10h
  125. push dx
  126. jmp Next
  127. ;---------------------------------
  128. ;---------处理换行--------------------
  129. enter:
  130. mov ah,3
  131. mov bh,0
  132. int 10h
  133. inc dh
  134. mov dl,win_ulc
  135. mov bh,0
  136. mov ah,2
  137. int 10h
  138. jmp get_char
  139. ;--------------------------------
  140. ;---------光标上移-----------------------
  141. shift:
  142. mov ah,3
  143. mov bh,0
  144. int 10h
  145. dec dh
  146. cmp dh,win_ulr
  147. jge S
  148. inc dh
  149. S:
  150. mov bh,0
  151. mov ah,2
  152. int 10h
  153. jmp get_char
  154. ;------------光标下移------------------------
  155. down:
  156. mov ah,3
  157. mov bh,0
  158. int 10h
  159. inc dh
  160. cmp dh,win_lrr
  161. jbe D
  162. dec dh
  163. D:
  164. mov bh,0
  165. mov ah,2
  166. int 10h
  167. jmp get_char
  168. ;------------------------------------
  169. ;-------------光标左移--------------------
  170. left:
  171. mov ah,3
  172. mov bh,0
  173. int 10h
  174. dec dl
  175. cmp dl,win_ulc
  176. jge L
  177. inc dl
  178. dec dh
  179. cmp dh,win_ulr
  180. jge L
  181. inc dh
  182. L:
  183. mov bh,0
  184. mov ah,2
  185. int 10h
  186. jmp get_char
  187. ;-----------------------------
  188. ;------------光标右移-----------------
  189. right:
  190. mov ah,3
  191. mov bh,0
  192. int 10h
  193. inc dl
  194. cmp dl,win_lrc
  195. jbe R
  196. dec dl
  197. inc dh
  198. cmp dh,win_lrr
  199. jbe R
  200. dec dh
  201. R:
  202. mov bh,0
  203. mov ah,2
  204. int 10h
  205. jmp get_char
  206. ;-------------------------
  207. ;---------退格键---------------
  208. back:
  209. mov ah,3
  210. mov bh,0
  211. int 10h
  212. dec dl
  213. cmp dl,win_ulc
  214. jge B
  215. mov dl,win_lrc
  216. dec dh
  217. cmp dh,win_ulr
  218. jge B
  219. inc dh
  220. B:
  221. mov bh,0
  222. mov ah,2
  223. int 10h
  224. push dx
  225. mov dl,20h
  226. mov ah,2
  227. int 21h
  228. pop dx
  229. mov bh,0
  230. mov ah,2
  231. int 10h
  232. jmp get_char
  233. ;-----------退出程序------------------------
  234. exit:
  235. mov ax, 4c00h ; exit to operating system.
  236. int 21h
  237. ends
  238. end start ; set entry point and stop the assembler.

---------------------
作者:NK_test
来源:CSDN
原文:https://blog.csdn.net/nk_test/article/details/46045201
版权声明:本文为作者原创文章,转载请附上博文链接!

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

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

    https://blog.csdn.net/NK_test/article/details/46045201 汇编实现的一个简易的文本编辑器,代码中有详细的注释. 思路和细节: (1) 在屏幕中央初始 ...

  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. 关于“习惯”的精彩分析
  2. 用python读取股票价格_使用Python写一个量化股票提醒系统
  3. python教程:读取.dcm文件,并转化为.jpg格式
  4. C++之链表中头指针、头节点、首元结点的
  5. 提取网页里面全部所有链接的方法
  6. [CODEVS1258]关路灯
  7. oracle下载安装教程
  8. 毕业论文课题研究背景怎么写?
  9. 电脑上如何快速将图片压缩变小?
  10. 2023年天津仁爱学院专升本化学工程与工艺对口专业限制目录
  11. 三菱Q系列PLC数据采集随笔
  12. 逐点插入法-delaunay三角剖分
  13. fabric 部署测试网络
  14. Tomcat安装、配置、优化及负载均衡详解
  15. SQL——分组统计查询
  16. Android解析xml文件获取数据练习
  17. JavaScript 数组之every
  18. 2020-12-6 CCF201803-2 碰撞的小球
  19. 小学生有必要学机器人编程吗
  20. 进销存设计与分析_应收汇总表(15)

热门文章

  1. 物料科目组设置和分配-OVK5/SM30(V_TVKM)/VKOA
  2. 科技交流英语(2022秋)Unit1-Unit8题干速查
  3. 手游冷知识丨为什么绝大多数手游不开放自由交易系统?
  4. 快速定位线上慢 SQL 问题,掌握这几个性能排查工具可助你一臂之力
  5. 迅捷画图中套用流程图模板编辑方法介绍
  6. creo二次开发python_使用C#/.net语言进行ProE/Creo二次开发
  7. 车机蓝牙通话流程分析的流程分析
  8. PPT这样学就对了之首页制作
  9. Java文本控件型号_小博老师解析Java核心技术 ——JSwing文本型控件
  10. 滚动截屏APP—Faststone Capture破解版注册码