当前位置: 代码迷 >> 汇编语言 >> 默认数据段,默认栈段,默认ds和si的有关问题
  详细解决方案

默认数据段,默认栈段,默认ds和si的有关问题

热度:204   发布时间:2016-05-02 04:29:41.0
默认数据段,默认栈段,默认ds和si的问题
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的值从哪取数据?
请大家帮我看看这个程序,解释一下这三个问题,感激不尽!
------解决思路----------------------
1. si 默认为 0。dos 载入程序设置 cs:ip 和 ss:sp 到相应位置,其它段寄存器指向 psp,通用寄存器为 0;debug 则会将 bx:cx 置为文件载入的大小,其它为 0。
2. 不设置堆栈,SS:SP 指向 psp 后那个 64K 段的最后,即 SS=psp+10h,sp=0000。这对通常的简单的程序来说,是没有问题的;如果程序较大超过 64K 了或对内存使用上有要求,就要自己定义堆栈。
  相关解决方案