数据标号的大问题.高手们求解
[local]1[/local]附件里有两条指令的机器码
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