贴一段代码

本文介绍了一个使用汇编语言实现的字符栈程序,包括字符的入栈、出栈及显示功能。通过键盘输入字符进行操作,并针对不同输入(如退格、回车)做出响应。该程序有助于理解栈的基本原理及其在实际中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

;----------------------------------------------------------------------
;
Program: 字符栈的入栈、出栈和显示
;
ah为功能号 0表示入栈 1出栈 2显示字符
;
对于2号功能 dh 为显示行数 dl为显示列数 
;
----------------------------------------------------------------------
assume cs:codesg

codesg segment

main:        call getstr
        mov ax
,4c00H
        int 21H

getstr:        push ax

getstr_start:    mov ah
,0                ;获取键入码
        int 16h

        cmp al
,20h                ;ascii码小于20H 表明不是字母 调用功能处理过程
        jb nochar
        mov ah
,0
        call charstack                
;调用入栈
        mov ah,2
        call charstack                
;显示字幕                
        jmp getstr_start            ;循环调用 等待输入

nochar:        cmp ah
,0eh                ;处理非字母的路口 主要用于判断是enter 还是backspace
        je backspace
        cmp ah
,1ch
        je putenter
        jmp getstr_start

backspace:    mov ah
,1                ;出栈
        call charstack
        mov ah
,2                ;显示
        call charstack
        jmp getstr_start

putenter:    mov ax
,0                
        call charstack
        mov ah
,2
        call charstack

        pop ax                    
;enter键 当前输入结束
        ret

charstack:    jmp short charstart

table dw charpush
,charpop,charprepare
top dw 
0

charstart:    push bx
        push dx
        push di
        push es

        cmp ah
,2
        ja sret                    
        mov bl
,ah
        mov bh
,0
        add bx
,bx                
        jmp word ptr table
[bx]            ;根据"hash"表寻址  我是这样理解的

charpush:    mov bx
,top                
        mov 
[si+bx],al
        inc top
        jmp sret                        
    
charpop:    cmp top
,0                ;top是否指向栈底            
        je sret
        dec top                    
        mov bx
,top
        mov al
,[si+bx]
        jmp sret


charprepare:    mov ax
,0b800H                ;为显示字母做准备 确定行数列数
        mov es,ax
        mov al
,160
        mov ah
,0
        mul dh
        mov di
,ax
        add dl
,dl
        mov dh
,0
        add di
,dx

        mov bx
,0

charshow:    cmp bx
,top                ;比较是否为空
        jne notempty                ;为空就输出当前字母
        mov byte ptr es:[di],' '        ;最后结尾输出一个空格
        jmp sret

notempty:    mov al
,[si+bx]
        mov es:
[di],al
        mov byte ptr es:
[di+1],02h
        inc bx
        add di
,2
        jmp charshow

sret:        pop es
        pop di
        pop dx
        pop bx
        ret

codesg ends
end main

 

学了数据结构的栈 再看这个似乎更容易些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值