lsjtys2 发表于 2017-7-29 16:10:48

检测点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:20:39

本帖最后由 lsjtys2 于 2017-7-29 16:25 编辑

想很长时间了,实在想不出给的是数据段的段地址和 栈的偏移地址是怎么修改到栈里IP的值的,不是应该add ss:,bx才对吗?我用debug试了这答案没有问题,可就想不明白 给的是数据段的段地址和栈的偏移地址 却改了栈里的ip

lsjtys2 发表于 2017-7-29 21:16:24

明白了!任何以寄存器定址的不管??是什么都以ss为段地址

秋雪冬枫 发表于 2018-8-18 15:37:10

bp的段地址默认为ss的,bp+2是取得了se处的ip,后面加上bx的数值,就变成s处的ip了,后面取出ip值的时候,ip的值已经由原来的se的ip值变成s处的ip值了

秋雪冬枫 发表于 2018-8-18 19:32:47

mov ax,4c00h
          int 21h    这个指令在中断例程里多余了吧,因为在设置中断向量的时候不是有了么,而且ie ok 指令里有跳转转到出去后的

mov ax,4c00h
          int 21h   是不是重复了

燃烧的飞星 发表于 2019-12-26 17:38:05

lsjtys2 发表于 2017-7-29 16:20
想很长时间了,实在想不出给的是数据段的段地址和 栈的偏移地址是怎么修改到栈里IP的值的,不是应该add ss: ...

用bp默认是ss做段地址而不是ds做
页: [1]
查看完整版本: 检测点13.1(2)