????????数据标号的大问题.高手们求解?????????
jmp word ptr cs:table[bx] 正确
jmp word ptr table[bx] 错误
为什么第二条是错误的,据教程上所说,数据标号的默认段地址是cs段
而我下面使用top 为什么是正常的
如果我将table 与 top 的数据定义放到start (即程序入口)前 ,运行两次将发生错误
assume cs:code,ds:data
code segment
start:
mov ax,2000
mov ds,ax
mov si,0
mov dl,0
mov dh,0
call getstr
mov ax,4c00h
int 21h
getstr: push ax
getstrs: mov ah,0
int 16h ;接收键盘输入 ah返回扫描码 al返回ascii码
cmp al,20h
jb nochar ;ascii码小于20h说明不是字符
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
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 ;如果功能号大于2则返回,防止出现0,1,2以外的无用数
mov bl,ah ;功能号存入bl
mov bh,0
add bx,bx ;功能号*2 = 对应的数据标号所处偏移
jmp word ptr cs:table[bx]
jmp word ptr table[bx] ;调用bx功能号所对应的数据标号,如:table[4]
charpush: mov bx,top ;top记录着有几个字符
mov [si][bx],al ;字符串首地址送入字符al
inc top ;入栈的字符个数加1
jmp sret
charpop: cmp top,0 ;字符个数是否为0
je sret
dec top ;不为0 字符个数-1
mov bx,top ;bx=字符个数
mov al,[si][bx] ;将字符个数所对应的ds:[字符个数偏移]位置赋值到 al
jmp sret
charshow: mov bx,0b800h ;开始显示字符
mov es,bx
mov al,160
mov ah,0
mul dh ;al*dh = 160*行数 = 屏幕对应位置
mov di,ax ;将 ax 赋值给 di
add dl,dl ;dl*2 即列处,1列有2个字节,字符与属性
mov dh,0
add di,dx ;di=dh*160+dl*2,es:di指向显存--dh 从 mov di,ax来
mov bx,0 ;ds:[si+bx]指向字符串首地址
charshows: cmp bx,top ;判断栈顶,字符个数
jne noempty ;不为空的话(即不相等,top不为0),跳转到noempty
mov byte ptr es:[di],' ' ;显示完毕,字符尾加空格
jmp sret ;返回
noempty: mov al,[si][bx] ;al存入为要显示的字符从si+bx开始
mov es:[di],al ;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