. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->内中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  12.3的问题  [已解决] 回复[ 4次 ]   点击[ 417次 ]  
haojunyu
[帖 主]   [ 发表时间:2010-12-07 10:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-11-16 21:58
assume cs:codesg 

codesg segment 
start: 
                mov ax,cs 
                mov ds,ax 
                mov si,offset do0 
                mov ax,0 
                mov es,ax 
                mov di,200h 
                mov cx,offset do0end-offset do0 
                cld 
                rep movsb                ;把中断之后运行的程序代码送到 0000:0200 
                 
                mov ax,0 
                mov es,ax 
                mov word ptr es:[0*4],200h 
                mov word ptr es:[0*4+2],0        ;设置中断向量 
                 
                mov bx,1 
                mov ax,0ffffh 
                div bx                        ;溢出除法 
                 
        do0:jmp short do0start 
                db "divide error",0 
do0start: 
                mov ax,0 
                mov ds,ax 
                mov si,202h 
                 
                mov ax,0b800h 
                mov es,ax 
                mov di,12*160+36*2 
                 
        s:        mov ch,0 
                mov cl,byte ptr [si] 
                jcxz ok 
                mov al,[si] 
                mov es:[di],al 
                inc si 
                add di,2 
                jmp short s 
                 
                 
        ok:        mov ax,4c00h 
                int 21h 
do0end:        nop 
codesg ends 
end start 

问题:关于do0:jmp short do0start这一步,我觉得可以不要,直接按照顺序来执行不是也可以吗?
      还有cpu是如何执行db "divide error",0这条指令的?是不是直接向内存中写入,而且占的空间大小13个byte还是16个byte?
masmaster
[第1楼]   [ 回复时间:2010-12-07 10:58 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
第一,你觉得可以不要就不要,实验一下
第二,db 语句是在0:200处存放一个以0为结尾的字符串,cpu执行s循环,将这些字符显示在显示缓冲区b800h开始的内存
masmaster
[第2楼]   [ 回复时间:2010-12-07 10:59 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
是0:202
haojunyu
[第3楼]   [ 回复时间:2010-12-07 11:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-11-16 21:58
刚刚接受群里朋友的建议:自己编程检验去,小弟我就自问自答了。

1.关于do0:jmp short do0start这一步,我觉得可以不要,直接按照顺序来执行不是也可以吗? 

答:不可以,因为在内存中指令和数据都是以二进制数表示的,而且db是在代码段的,所以cpu会将overflow!这几个字符当成指令来执行,而且因为随机的组合,有可能连mov ax,cs这条指令都读不出来 

2.cpu是如何执行db "divide error",0这条指令的?是不是直接向内存中写入,而且占的空间大小13个byte还是16个byte?
答:因为cs:ip会指向它,所以将它当做指令来执行。当然它所占的空间为13个byte,而不是按照data段的规则来占据空间
haojunyu
[第4楼]   [ 回复时间:2010-12-07 11:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-11-16 21:58
此贴由 贴主 于 [ 2010-12-07 11:48 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved