理解了很长的时间,终于调出来了。
assume cs:code,ds:data
data segment
db 65535 dup(0)
data ends
code segment
start:
mov ax,data
mov ds,ax ;字符串存放段
call getstr ;调用接受字符串输入子程序
mov ax,4c00h
int 21h
;=========================================
getstr : push ax
getstrs: mov ah,0
int 16h
cmp al,20h ;ASCII少于20h不是字符
jb nochar
mov ah,0
call charstack ;字符入栈
mov ah,2
call charstack ;字符显示
jmp getstrs
nochar: cmp ah,0eh ;检测是否退格键扫描码
je backspace
cmp ah,1ch ;检测是否Enter扫描码
je enter
jmp getstrs ;再读取字符
backspace: mov ah,1
call charstack ;字符出栈
mov ah,2
call charstack ;字符显示
jmp getstrs
enter: mov al,0
mov ah,0
call charstack ;0字符入栈
mov ah,2
call charstack ;字符显示
pop ax
ret
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;子程序:字符串入栈,出栈,显示
;参数:(ah)=功能号,0入栈、1出栈、2显示
; 0 功能:(al)=入栈字符
; 1 功能:(al)=返回的字符
; 2 功能:(dh)行,(dl)列
; ds:si指向字符位置
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
charstack: jmp short charstart
table dw charpush,charpop,charshow
top dw 0 ;指示字符栈的顶位
charstart: push bx
push dx
push di
push es
cmp ah,2 ;没有(ah)>2的功能
ja sret
mov bl,ah
mov bh,0
add bx,bx ;功能的调用
jmp word ptr table[bx]
charpush: mov si,top
mov ds:[si],al ;字符存入ds:[si]中
inc top ;top指向顶位
jmp sret
charpop: cmp top,0 ;判断有没字符可减
je sret
dec top ;顶位退一位
;------------------------------
;mov si,top
;mov al,[si]
;------------------------------
jmp sret
charshow: mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov si,0
charshows:cmp si,top ;判断是否全部输出
jne noempty
mov byte ptr es:[di],' ' ;;覆盖前一位(应该是作退格功能)
;mov byte ptr es:[di+1],07h
jmp sret
noempty: mov al,[si]
mov es:[di],al ;传送字符到显存
;mov es:[di+1],07h
;mov byte ptr es:[di+2],' '
inc si ;指向内存的下一个字符
add di,2
jmp charshows
sret:pop es
pop di
pop dx
pop bx
ret
code ends
end start
- [zihaolee] 哦 我记得就是debug里,用g直接把程序运完,发现寄存器不改变;用t或p单步运行,就能看到寄存器 04/28 15:52
- [mywiil] 今天做rep movsb(P232)页时,发现用G直接执行完程序,寄存器不会改变,用T单步执行就能改 04/25 20:10