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

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

思路和细节:

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

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

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

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

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

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

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

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

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

 

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

 

 

 


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