首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

????????数据标号的大有关问题.高手们求解?????????

2013-09-29 
????????数据标号的大问题.高手们求解?????????jmp word ptr cs:table[bx] 正确jmp word ptr table[bx]错

????????数据标号的大问题.高手们求解?????????


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


[解决办法]
不要率性地直接使用一个不只究里的内存块,比如你这里的 ds:2000 什么的。
table 放在 code 段里,最简单的就是将 ds 也指向 code 段。或者,将其放在另外的数据类段里,让 ds 指向那个段。

热点排行