【汇编】 13.3 对int iret和栈的深入理解

书中示例

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

同上。

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 
相关推荐
百年孤独_4 天前
对于基础汇编的趣味认识
汇编·性能优化
xiaozhiwise4 天前
ARM base instruction -- ccmp
汇编
向你扔鸡爪7 天前
Visual Studio-X64汇编编写
汇编·windows·visual studio
Lordaeron_ESZ7 天前
CSAPP Attack Lab
linux·汇编
xiaozhiwise8 天前
ARM base instruction -- sxtw
汇编
天赐细莲11 天前
C++的哲学思想
java·c语言·汇编·c++·python
王鑫的博客88611 天前
ARM基础知识点及简单汇编语法
linux·汇编·arm开发
洛书千年11 天前
linux驱动开发-arm汇编基础
汇编·arm开发·驱动开发
小咖拉眯11 天前
vscode将c++项目打包exe进行反汇编练习
c语言·汇编·c++·ide·vscode·安全·密码学
妖怪喜欢风14 天前
Linux 5.0在start_kernel之前做了什么事?(以aarch64为例)
linux·汇编