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

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

思路和细节:

(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.
时间: 2024-08-29 07:57:02

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

简易文本编辑器(Delphi源码)

计划一个简略单纯的文本编纂器,具有建立.编纂.生存平凡文本文件的功能. unit U nit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls; type  TForm1 = class(TForm)    Panel1: TPanel;    Memo1: TMemo;    OpenDialog1:

C++ mfc 简易文本编辑器 遇到的一些问题

[题目40]简易文本编辑器. 设计一个简易的文本编辑器. 设计要求: (1) 具有图形菜单界面: (2) 查找,替换(等长,不等长),插入(插串,文本块的插入).文本块移动(行块,列块移动),删除; (3) 可正确存盘.取盘: (4) 正确显示总行数. 这是题目.................. 使用基于对话框的MFC   我想到的感觉有问题的点! 查找替换 算法不了解  最烦人的时文本块移动 百度好多业找不到!!呵呵难受的是在吾爱发个两个帖子求一下思路 被狗骂了那个人是真的神精符附上链接ht

C# 文本框只能输入数字和退格键 (转)

C# 文本框只能输入数字和退格键 private void TextBox_KeyPress(object sender, KeyPressEventArgs e) { if(e.KeyChar!=8&&!Char.IsDigit(e.KeyChar)) { e.Handled = true; } } 或者 private void TextBox_KeyPress(object sender, KeyPressEventArgs e) { if(e.KeyChar!='\b'&&

Java实现"命令式"简易文本编辑器原型

源自早先想法, 打算从界面方向做些尝试. 找到个简单文本编辑器的实现: Simple Text Editor - Java Tutorials. 原本的菜单/按钮界面如下. 包括基本功能: 新建/打开/保存文件, 文本编辑与剪切/复制/粘贴. 把所有菜单/按钮替换为命令输入后效果如下, 源码库在: program-in-chinese/simple-text-editor-in-Java. 与其他命令行工具一样, 省去界面元素的代价是输入较繁琐. 在文本和命令两处切换也有点麻烦. 接下去试着实现

解决Ubuntu14.04下vi编辑器不能使用方向键和退格键问题

参考:http://blog.sina.com.cn/s/blog_7d0c2fed01010zbi.html 系统:Ubuntu14.04 使用vi命令时,不能正常编辑文件,使用方向键时老是出现很多字母 这个问题主要是新系统直装了vi,没有装vim.因为vi是不能直接按退格键删除字符的,所以当你使用退格键删除字符,只有在按下esc时,那些字符才会消失...vim可以直接像记事本一样编辑字符! 在网上找了个方法问题已经解决 分享一下:只要依次执行以下两个命令即可完美解决Ubuntu下vi编辑器方

java文本编辑器5

1 package peng_jun; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 import java.io.*; 9 10 import javax.swing.filechooser.*; 11 12 import java.awt.datatransfer.*; 13 14 public class Text4 extends JFrame { 15 public sta

java文本编辑器 版本4

1 package peng_jun; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 import java.io.*; 9 10 import javax.swing.filechooser.*; 11 12 import java.awt.datatransfer.*; 13 14 public class Text3 extends JFrame { 15 public sta

简易文本编译器

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <math.h>#define MAX_LEN 240#define NOT_FOUND -1//函数声明  void HeadWord(void);      //输出大标题,永远出现在程序的最顶端.  void PrintWord(void);    //输出文本的内容 void

Java实现简易的文本编辑器

需求分析: 获得文本名称 实现尾部追加功能 实现覆盖式添加数据 删除数据 获取光标位置 在特定光标位置处添加数据 查找特定字符串在主串中第一次出现的位置 统计文本文件内出现的数字,汉字,英文字母,特殊字符的个数,及总的字符个数 开发环境: windows7 + Eclipse luna + WindowsBuilder插件 代码实现: import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.ev