| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 661 人关注过本帖
标题:数据标号的大问题.高手们求解
只看楼主 加入收藏
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:5 
数据标号的大问题.高手们求解
[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

搜索更多相关主题的帖子: start 
2013-09-11 00:42
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
收藏
得分:0 
发 不了图片

机器码我打出来好了,, 第一条指令:
程序代码:
2E 046
FF 255
67 103
51 081
;调试显示  
cs:
jmp w.[BX] + 051h

第二条指令
程序代码:
FF 255
67 103
51 081
;调试显示
jmp w.[BX] + 051h

hl928452957@gmail点com

2013-09-11 00:46
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:0 
额表示无奈

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2013-09-11 11:57
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
收藏
得分:0 
回复 3楼 liufashuai
看不懂吗?

hl928452957@gmail点com

2013-09-12 07:33
风尘儒生
Rank: 2
等 级:论坛游民
帖 子:8
专家分:31
注 册:2010-11-25
收藏
得分:20 
JMP   WORD PTR  OPRD
OPRD 可以是除立即数外的任何寄存或存储器寻址方式,转移的目标地址由OPRD的内容确定;
你试试    jmp word ptr ds:table[bx]
        mov    ds,cs
          jmp word ptr table[bx]
我这没环境调试。。试了帮忙告诉我。。
2013-09-12 14:04
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
收藏
得分:0 
回复 5楼 风尘儒生
.~那还不如cs  


问题是ds我需要用在其他地方

难道要我加三行push ds pop ds

hl928452957@gmail点com

2013-09-12 17:59
快速回复:数据标号的大问题.高手们求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020170 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved