zy8818 发表于 2018-3-18 22:07:56

内中断问题,无法运行







*******************
1.asm代码
assume cs:code




code segment
start:
        mov ax,1000h
        mov bl,1
        div bl
       
        mov ax,4c00h
        int 21h

code ends
end start
*********************
2.asm代码
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                ;根据cx的长度循环拷贝代码


        mov ax,0
        mov es,ax
        mov word ptr es:,200h        ;设置0号中断的ip地址
        mov word ptr es:,0        ;设置0号中断的cs地址

        mov ax,4c00h
        int 21h






do0:        jmp short do0start
        db "Welcome to china.com!"
do0start:
        mov ax,cs
        mov ds,ax
        mov si,202h        ;设置ds:si指向要显示字符串

        mov ax,0b800h        ;设置显存的段地址
        mov es,ax
        mov di,12*160+36*2;设置显示的行数12,列数36

        mov cx,21        ;设置字符串的长度
s:        mov al,
        mov es:,al        ;显卡的显示数据为 低位:字符(单字节),高位:颜色(单字节)
        inc si       
        add di,1
        mov al,02h        ;设置颜色
        mov es:,al
        add di,1
        loop s

do0end:


code ends

end start

人造人 发表于 2018-3-18 23:26:23

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                                ;根据cx的长度循环拷贝代码
       
        mov ax, 0
        mov es, ax
        mov word ptr es:,200h                ;设置0号中断的ip地址
        mov word ptr es:, 0                ;设置0号中断的cs地址
       
        mov ax, 4c00h
        int 21h
       
       
do0:        jmp short do0start
        db "Welcome to china.com!"
do0start:
        mov ax, cs
        mov ds, ax
        mov si, 202h                        ;设置ds:si指向要显示字符串
       
        mov ax, 0b800h                        ;设置显存的段地址
        mov es, ax
        mov di, 12 * 160 + 36 * 2        ;设置显示的行数12,列数36
       
        mov cx, 21                        ;设置字符串的长度
s:
        mov al,
        mov es:, al                        ;显卡的显示数据为 低位:字符(单字节),高位:颜色(单字节)
        inc si
        add di, 1
        mov al, 02h                        ;设置颜色
        mov es:, al
        add di, 1
        loop s
       
       
        mov bp, sp
        add word ptr , 2
        iret                                ; ^_^
do0end:
code ends
end start

zy8818 发表于 2018-3-19 12:29:30

      mov bp, sp
      add word ptr , 2
      iret                              ; ^_^

谢谢了,这个代码加上就可以了但是我看不明白,iret 不是要先push吗?
      mov bp, sp
      add word ptr , 2这两句是什么意思的不明白

人造人 发表于 2018-3-19 13:14:36

zy8818 发表于 2018-3-19 12:29
mov bp, sp
      add word ptr , 2
      iret                              ; ^_^




DIV BL 的地址: 0BA8:0005
记住这个地址,之后会用到






在返回之前,栈中就有了返回地址,不过这个地址会返回到 DIV BL 指令,然后执行 DIV BL 指令,再一次中断,再一次执行中断处理程序,然后再一次返回到 DIV BL 指令,继续中断,继续返回 ......
所以不能返回到 DIV BL 指令,应该返回到 DIV BL 指令的下一条指令,DIV BL 指令的长度是 2,将栈中的那个 IP 加 2,指向 DIV BL 指令的下一条指令,用 iret 返回以后,就会执行 DIV BL 指令的下一条指令







至于为什么,在返回之前,栈中会有返回地址
这个等你学到后面就明白了

zy8818 发表于 2018-3-19 20:29:06

为什么这个直接用iret不行,后面的视频求平方的可以

人造人 发表于 2018-3-20 16:48:45

zy8818 发表于 2018-3-19 20:29
为什么这个直接用iret不行,后面的视频求平方的可以

发完整代码

zy8818 发表于 2018-3-21 21:27:27

;功能:制作int 7ch指令,实现计算平方的功能
;参数:ax存放计算平方的数,结果存放在dx(高位),ax(低位)
assume cs:code

code segment
start:       
        ;设置源段地址:偏移地址ds:si
        mov ax,cs
        mov ds,ax
        mov si,offset do0-offset start

        ;设置目标段地址:偏移地址es:di
        mov ax,0
        mov es,ax
        mov di,200h       

        ;设置复制字符长度,正向,循环单字节复制
        mov cx,offset do0end-offset do0
        cld
        rep movsb

        ;修改7ch处的中断程序入口地址
        mov ax,0
        mov ds,ax
        mov bx,7ch*4
        mov word ptr,200h
        mov word ptr,0       

        mov ax,4c00h
        int 21h

do0:        mul ax
        iret


do0end:        nop


code ends
end start


;利用自写int 7ch指令计算 2*3456^2
assume cs:code

code segment
start:        mov ax,3456
        int 7ch
        add ax,ax
        adc dx,dx

        mov ax,4c00h
        int 21h


code ends

end start
这个直接用iret可以正常返回

人造人 发表于 2018-3-22 15:12:56

zy8818 发表于 2018-3-21 21:27
;功能:制作int 7ch指令,实现计算平方的功能
;参数:ax存放计算平方的数,结果存放在dx(高位),ax(低位)
assu ...



INT      7C         的地址:0BA8:0003
ADD      AX, BX   的地址:0BA8:0005





可以看到这次栈中的指针指向 ADD      AX, BX 指令
IRET 返回后就去执行 ADD      AX, BX 了


为什么呢?

我上面都已经说过了,继续往后学,后面解释过了
为什么不现在解释?
因为现在学到的这些知识不足以解释这个现象

所以,继续往后学

装糊涂 发表于 2019-12-11 10:09:39

大佬厉害{:10_256:}
页: [1]
查看完整版本: 内中断问题,无法运行