能力值:
( LV2,RANK:10 )
|
-
-
2 楼
居然没人回答... 我在CMD中直接运行该程序却能运行,只是没有出现预想的显示结果(显示出错提示)!!!下面是我的源码:
assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov si,offset do0 ;设置 ds:si 指向(被安装程序)源地址
mov ax,0000h
mov es,ax
mov di,200h ;设置 es:di 指向(被安装程序)目的地址
mov cx,offset do0end - offset do0 ;获取被安装程序长度(字节数)
cld ; movsb 设置循环递增(传送方向)
rep movsb ;循环传送
;do0 安装程序
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h ;设置0号中断向量中的IP
mov word ptr es:[0*4+2],0 ;设置0号中断向量中的CS
;设置中断向量表
mov ax,1000h
mov bl,1
div bl
mov ax,4c00h
int 21h
;程序退出
;0号中断处理程序内容
do0:jmp short do0start ;跳到处理程序 “代码段”
db 'divide error!' ;处理程序的 “数据段”
do0start:mov ax,cs
mov ds,ax
mov si,202h ;设置 ds:si 指向字符串
mov ax,0b800h
mov es,ax
mov di,12*160+36*2 ;设置 es:di 指向显存空间的中间位置,有关这个地址的问题我压根不懂(以上地址是书上的,网上的内容也是这样的)
mov cx,13
s:mov al,[si]
mov es:[di],al ;内存不能到内存,所以借助寄存器
inc si
add di,2 ;为什么加2?
loop s
mov ax,4c00h
int 21h ;处理程序直接回到DOS 不返回中断产生时的程序
;中断处理程序全部内容
do0end:nop ;这一步不仅为空操作,实际上也没有执行(不管是安装程序,还是中断处理程序)
code ends
end start
不知道是不是显示出错信息那里有问题(已注释),还是其他问题
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我用的是 XP 的系统,我发现在DOS中显示内容的地址应该跟系统有关系...
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
assume cs:code
code segment
main:mov ax,0b800h
mov es,ax
mov byte ptr es:[12*160+40*2],'!'
int 0
code ends
end main
为什么这么简单的程序都不能显示“! ” 和 “divide overflw”呢?求高手指教
|