可以使用movsb指令,将do0的代码送入0:200处。程序如下
assume cs:code code segment start: 设置 es:di 指向目的地址 设置 ds:si 指向源地址 设置 cx 为传输长度 设置传输方向为正 rep movsb 设置中断向量表 mov ax,4c00h int 21h do0: 显示字符串 "overflow!" mov ax,4c00h int 21h code ends end start
我们来看一下,用 rep movsb 指令的时候需要确定的信息。
(1)传送的原始地址,段地址:code,偏移地址:offset do0
(2)传送的目的地址:0:200
(3)传送的长度:do0 部分代码的长度
(4)传送的方向:正向
问题是,我们如何知道do0代码的长度?最简单的方法是,计算一下do0中所有指令码的字节数。但是这样做太麻烦了,因为只要do0的内容发生了改变,我们都要重新计算它的长度。
assume cs:code code segment start: mov ax,cs mov ds,ax mov si, offset do0 ;设置 ds:si 指向源地址 mov ax,0 mov es,ax mov di,200h ;设置 es:di 指向目的地址 mov cx, offset do0end - offset do0 ;设置 cx 为传输长度 cld ;设置传输方向为正 rep movsb 设置中断向量表 mov ax,4c00h int 21h do0: 显示字符串"overflow!" mov ax,4c00h int 21h do0end: nop code ends end start
“-” 是编译器识别的运算符号,编译器可以用它来进行两个常熟的减法。
比如,指令:mov ax,8-4,被编译器处理为指令:mov ax,4
汇编编译器可以处理表达式。
比如,指令:mov ax,(5+3)*5/10,被编译器处理为指令:mov ax,4 0
好了,知道了“-”的含义,对于用offset do0end-offset do0,得到do0代码的长度的原理,就可以进行分析了。