|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code
;data segment
; dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;data ends;用这个数据段反而输入第45个字符时开始乱码,为什么?
;不用这个数据段反而能输入第261个字符时开始乱码,这是为什么?
code segment
start: ;mov ax,data
;mov ds,ax
;mov si,0
call getstr
getstr: push ax;没有栈这个压入哪个栈?
getstrs:mov ah,0
int 16h
cmp al,20h
jb nochar
mov ah,0
call charstack
mov ah,2
mov dh,5;起始行
mov dl,4;起始列
call charstack
jmp getstrs
nochar: cmp ah,0eh
je backspace
cmp ah,1ch
je enter1
jmp getstrs
backspace:mov ah,1
call charstack
mov ah,2
call charstack
jmp getstrs
enter1: mov al,0
mov ah,0
call charstack
mov ah,2
call charstack
pop ax
ret
charstack: jmp short charstart
table dw charpush,charpop,charshow
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]
charpush: mov bx,top
mov [si][bx],al;如果没有开始的数据段,[si][bx]中si的值从哪取数据,ds的值从哪取数据
inc top
jmp sret
charpop: cmp top,0
je sret
dec top
mov bx,top
mov al,[si][bx];如果没有开始的数据段,[si][bx]中si的值从哪取数据,ds的值从哪取数据
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 bx,0
charshows: cmp bx,top
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty: mov al,[si][bx];如果没有开始的数据段,[si][bx]中si的值从哪取数据,ds的值从哪取数据
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows
sret: pop es
pop di
pop dx
pop bx
ret
code ends
end start
这个程序有三个问题:
1、用这个数据段在输入第45个字符时开始乱码,为什么?不用这个数据段反而能输入第261个字符时开始乱码,这是为什么?是不是有默认的数据段?
2、程序中没有设置栈段,那么入栈出栈用的哪个栈?是不是有默认的栈段?
3、如果没有使用开始的数据段,[si][bx]中si的值从哪取数据,ds的值从哪取数据?
请大家帮我看看这个程序,解释一下这三个问题,感激不尽!
|
|