检测点13.1(2)
本帖最后由 lsjtys2 于 2017-7-29 16:53 编辑用7ch中断完成loop指令答案:
assume cs:code
code 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
mov ax,0
mov es,ax
mov word ptr es:,200h
mov word ptr es:,0
mov ax,4c00h
int 21h
do0:push bp
mov bp,sp
add ,bx
pop bp
iret
mov ax,4c00h
int 21h
do0end:nop
code ends
end start
有一点不明白 do0 段中add ,bx 是把栈里的ip拿出来修改,实现loop循环
索引的段地址应该是ds没错吧! 是add ds:,bx这样段地址是数据段的段地址和栈的偏移地址是怎么可能修改到栈里的ip的? 本帖最后由 lsjtys2 于 2017-7-29 16:25 编辑
想很长时间了,实在想不出给的是数据段的段地址和 栈的偏移地址是怎么修改到栈里IP的值的,不是应该add ss:,bx才对吗?我用debug试了这答案没有问题,可就想不明白 给的是数据段的段地址和栈的偏移地址 却改了栈里的ip 明白了!任何以寄存器定址的不管??是什么都以ss为段地址 bp的段地址默认为ss的,bp+2是取得了se处的ip,后面加上bx的数值,就变成s处的ip了,后面取出ip值的时候,ip的值已经由原来的se的ip值变成s处的ip值了 mov ax,4c00h
int 21h 这个指令在中断例程里多余了吧,因为在设置中断向量的时候不是有了么,而且ie ok 指令里有跳转转到出去后的
mov ax,4c00h
int 21h 是不是重复了 lsjtys2 发表于 2017-7-29 16:20
想很长时间了,实在想不出给的是数据段的段地址和 栈的偏移地址是怎么修改到栈里IP的值的,不是应该add ss: ...
用bp默认是ss做段地址而不是ds做
页:
[1]