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

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

思路和细节:

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

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

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

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

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

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

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

; by Tachdata segmentEsc_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!$"endsstack segmentdw 128 dup(0)endscode segmentstart: ; set segment registers:mov ax, datamov ds, axmov es, ax;———-输出标题——————mov ah,2mov dh,win_ulr-1mov dl,win_ulc+2mov bh,0int 10hlea dx, stringmov ah, 9int 21h; output string at ds:dx ;————————————- locate: ;—–设置光标初始位置———–mov ah,2mov dh,win_ulrmov dl,win_ulcpush dxmov bh,0int 10h ;——————————–;—-初始化屏幕——————mov ah,6mov ch,win_ulrmov cl,win_ulcmov dh,win_lrrmov dl,win_lrcmov bh,0F4h ;白底红字int 10hpop dx;—————————-get_char:mov ah,0 ;16h 0号功能,ah中放扫描码,al中放ascii码int 16hcmp al,0 ;if 功能键 then al=0je K;—–利用ascii码判断———————–cmp al,Esc_keyje exitcmp al,0dhje entercmp al,board_backje back;—读取当前光标位置—————mov ah,3mov bh,0int 10h ;———————push dx ;保护变量cmp dl,win_lrc ;输入字符时是否越过右列值jge NKjmp N NK:inc dhmov dl,win_ulcpush dx ;——————–mov bh,0 ;重新设置光标位置mov ah,2int 10h;——————- N:cmp dh,win_lrrjge roll ;是否越过下界,上卷 Next:mov dl,al ;输出输入的字符mov ah,2int 21hpop dxjmp get_char;——-对功能键(扫描码)的处理————— K:cmp ah,board_shiftjz shiftcmp ah,board_downje downcmp ah,board_leftje leftcmp ah,board_rightje rightjmp get_char;————-上卷一行——————— roll:mov ah,6push axmov al,1mov ch,win_ulrmov cl,win_ulcmov dh,win_lrrmov dl,win_lrcmov bh,0F4hint 10hpop axpop dxcmp dh,win_lrrjbe KKdec dhKK:dec dh ;上卷之后,dh随之自减mov bh,0mov ah,2int 10hpush dxjmp Next ;——————————— ;———处理换行——————– enter:mov ah,3mov bh,0int 10hinc dhmov dl,win_ulcmov bh,0mov ah,2int 10hjmp get_char ;——————————– ;———光标上移———————– shift:mov ah,3mov bh,0int 10hdec dhcmp dh,win_ulrjge Sinc dh S:mov bh,0mov ah,2int 10hjmp get_char ;————光标下移———————— down:mov ah,3mov bh,0int 10hinc dhcmp dh,win_lrrjbe Ddec dh D:mov bh,0mov ah,2int 10hjmp get_char ;———————————— ;————-光标左移——————–left:mov ah,3mov bh,0int 10hdec dlcmp dl,win_ulcjge Linc dldec dhcmp dh,win_ulrjge Linc dh L:mov bh,0mov ah,2int 10hjmp get_char;—————————–;————光标右移—————– right:mov ah,3mov bh,0int 10hinc dlcmp dl,win_lrcjbe Rdec dlinc dhcmp dh,win_lrrjbe Rdec dh R:mov bh,0mov ah,2int 10hjmp get_char ;————————- ;———退格键—————back:mov ah,3mov bh,0int 10hdec dlcmp dl,win_ulcjge Bmov dl,win_lrcdec dhcmp dh,win_ulrjge Binc dh B:mov bh,0mov ah,2int 10hpush dxmov dl,20hmov ah,2int 21hpop dxmov bh,0mov ah,2int 10hjmp get_char ;———–退出程序———————— exit:mov ax, 4c00h ; exit to operating system.int 21hendsend start ; set entry point and stop the assembler.

总在盼望未来,愿你的人生美开

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

相关文章:

你感兴趣的文章:

标签云: