可以使用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代码的长度的原理,就可以进行分析了。
