【汇编】 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 
相关推荐
一品人家2 天前
win32汇编环境,得到当前日期时间的例子
汇编
试试看1682 天前
自制操作系统第三天
汇编·系统架构
0xCC说逆向5 天前
Windows逆向工程入门之汇编位运算
c语言·汇编·windows·安全·逆向
矮油0_o5 天前
30天开发操作系统 第 20 天 -- API
c语言·汇编·操作系统
charlie1145141915 天前
从0开始的操作系统手搓教程 4:做好准备,跳到加载器(Loader)
汇编·学习·操作系统·调试·mbr·手搓教程·bochs
官子无敌刘小路8 天前
汇编简介&常用语法
汇编
二进制怪兽11 天前
[笔记] 汇编杂记(持续更新)
汇编
bae-唯一12 天前
关于32位和64位程序的传参方法及虚拟机调试工具总结
汇编·学习
E_han13 天前
7.list
开发语言·汇编·数据结构·c++·算法·list
二进制怪兽13 天前
[笔记] x86汇编语言:从实模式到保护模式之第一章 十六进制计数法
汇编