内中断问题,无法运行
*******************
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 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
mov bp, sp
add word ptr , 2
iret ; ^_^
谢谢了,这个代码加上就可以了但是我看不明白,iret 不是要先push吗?
mov bp, sp
add word ptr , 2这两句是什么意思的不明白 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 指令的下一条指令
至于为什么,在返回之前,栈中会有返回地址
这个等你学到后面就明白了
为什么这个直接用iret不行,后面的视频求平方的可以 zy8818 发表于 2018-3-19 20:29
为什么这个直接用iret不行,后面的视频求平方的可以
发完整代码 ;功能:制作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可以正常返回 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 了
为什么呢?
我上面都已经说过了,继续往后学,后面解释过了
为什么不现在解释?
因为现在学到的这些知识不足以解释这个现象
所以,继续往后学 大佬厉害{:10_256:}
页:
[1]