|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code
stack segment
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
push cs ;把cs的值压入栈
pop ds ;用ds来接收cs的值
mov ax,0
mov es,ax
mov si,offset int9 ;设置ds:si指向源地址
mov di,204h ;设置ds:di指向目标地址
mov cx,offset int9end - offset int9;设置cx为传输的长度
cld ;正向传输
rep movsb
;保存原int 9 程序
push es:[9*4] ;原int 9偏移地址推入战中
pop es:[200h] ;用es:[200h]来保存原int 9的偏移地址
push es:[9*4+2] ;原int 9段地址推入栈中
pop es:[202h] ;用es:[202h]来保存原int 9的段地址
;在中断向量表中设置新的int 9中断例程的入口地址
cli ;设置 if = 0 屏蔽中断
mov word ptr es:[9*4],204h ;新的int 9偏移地址放到204h中
mov word ptr es:[9*4+2],0 ;cs存放到段地址为0
sti ;设置if = 1 不屏蔽中断
mov ax,4c00h
int 21h
;---------新int 9中断例程----------
int9: ;把要用到的寄存器保存起来
push ax
push bx
push cx
push es
in al,60h ;把60h端口的数据传入给al中
pushf ;标志寄存器推入栈
call dword ptr cs:[200h];当此中断执行时,(cs)=0
cmp al,3bh ;F1的键盘扫描码是3bh
jne int9ret
;全屏变颜色
mov ax,0b800h ;显存地址
mov es,ax
mov bx,1
mov cx,2000
s: inc byte ptr es:[bx]
add bx,2
loop s
int9ret:
pop ax
pop bx
pop cx
pop es
iret
int9end: nop
code ends
end start
以上是书上的源代码,想问高亮的部分为什么不能用mov word ptr es:[9*4],200h mov word ptr es:[9*4+2],204h来传输而是用栈来传输这个cs:ip地址?
本帖最后由 xieglt 于 2020-8-12 12:12 编辑
;es:[9*4]的值入栈
push es:[9*4]
;将刚入栈的值弹出,保存进内存ES:[200h]
pop es:[200h]
;es:[9*4+2]的值入栈
push es:[9*4+2]
;将刚入栈的值弹出,保存进内存ES:[202h]
pop es:[202h]
可以改写成:
;将ES:[9*4]内存的值=>AX
MOV AX,WORD PTR ES:[9*4],
;AX的值=>内存ES:[200H]
MOV WORD PTR ES:[200H],AX
;将ES:[9*4+2]内存的值=>AX
MOV AX,WORD PTR ES:[9*4+2]
;AX的值=>内存ES:[202H]
MOV WORD PTR ES:[202H],AX
你的写法是传递的立即数,而且写反了
实际上应该是
mov word ptr es:[200h],word ptr es:[9*4]
但CPU不能直接把数据从内存传到内存,必须通过寄存器中转,也就是
mov ax,word ptr es:[9*4]
mov word ptr es:[200h],ax
书上的写法是通过栈中转数据。
|
|