书中示例
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset lp
mov ax,0
mov es,ax
mov di,200h
mov cx,offset end0-offset lp
cld
rep movsb ;lp到end0的指令传送到0:200处
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
;设置7c表项的入口地址为0000:0200,也就是int 7ch时,执行lp到end0的指令
mov ax,0b800h
mov es,ax
mov di,160*12
;设置bx的位移
mov bx,do0-se
mov cx,80
do0:
mov byte ptr es:[di],'!'
add di,2
int 7ch ;中断,cs和ip入栈。cs为do0所在的段地址,ip为执行完int 7ch后下一条指令的偏移地址
;此时栈顶是se的偏移地址
se:
nop
mov ax,4c00h
int 21h
lp: push bp ;bp入栈,此时栈顶是bp
mov bp,sp ;当前栈顶的偏移地址。
dec cx
jcxz lpret ;cx=0则转移到lpret,否则继续执行
add [bp+2],bx ;bp+2为se的偏移地址
;此时ip=se+bx=se+do0-se=do0
lpret:
pop bp ;bp出栈
iret ;ip、cs、flag依次出栈,此时ip=d0的偏移地址
;也就是回到do0标号处继续执行指令,直到cx=0,ip=se的偏移地址。
end0:
nop
mov ax,4c00h
int 21h
code ends
end start
可能还可以优化,这代码看着有点多。
检测点13.1
同上。文章来源:https://www.toymoban.com/news/detail-819180.html
assume cs:code
data segment
db 'conversation',0
data ends
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset lp
mov ax,0
mov es,ax
mov di,200h
mov cx,offset end0-offset lp
cld
rep movsb ;lp到end0的指令传送到0:200处
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
;设置7c表项的入口地址为0000:0200,也就是int 7ch时,执行lp到end0的指令
mov ax,0b800h
mov es,ax
mov ax,data
mov ds,ax
mov di,160*12
mov si,0
;设置bx的位移
mov bx,offset s-offset ok
s:
cmp byte ptr [si],0
je ok
mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],2
inc si
add di,2
int 7ch ;中断,cs和ip入栈。cs为s所在的段地址,ip为执行完int 7ch后下一条指令的偏移地址
;此时栈顶是ok的偏移地址
ok:
mov ax,4c00h
int 21h
lp: push bp ;bp入栈,此时栈顶是bp
mov bp,sp ;当前栈顶的偏移地址。
dec cx
jcxz lpret ;cx=0则转移到lpret,否则继续执行
add [bp+2],bx ;bp+2为ok的偏移地址
;此时ip=ok+bx=ok+s-ok=s
lpret:
pop bp ;bp出栈
iret ;ip、cs、flag依次出栈,此时ip=s的偏移地址
;也就是回到do0标号处继续执行指令,直到cx=0,ip=ok的偏移地址。
end0:
nop
mov ax,4c00h
int 21h
code ends
end start
文章来源地址https://www.toymoban.com/news/detail-819180.html
到了这里,关于【汇编】 13.3 对int iret和栈的深入理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!