操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。 比如下面的程序:
assume cs:codesg codesg segment start:mov ax,offset start ;相当于mov ax, 0 s: mov ax,offset s ;相当于movax,3 codesg ends end start
在上面的程序中,offset操作符取得了标号start和s的偏移地址0和3,所以指令:
may ax,offset start 相当于指令 mov ax,0,
因为start是代码段中的标号,它所标记的指令是代码段中的第一条指令,偏移地址为0;
mov ax,offset s 相当于指令 mov ax,3
代码段中的第二条指令,第一条指令长度为因为s是代码段中的标号,它所标记的指令是3个字节,则s的偏移地址为3
问题
有如下程序段,添写两条指令,使该程序在运行中将S处的一条指令复制到S0处
assume cd:codesg codesg segment s: mov ax,bx ;mov ax,bx的机器码占两个字节 mov si,offset s mov di,offset s0 ___________________ ___________________ s0: nop ;nop的机器码占一个字节 nop codesg ends end s
分析
(1) s和s0处的指令所在的内存单元的地址是多少?cs:offset s和cs:offset s0
(2) 将s处的指令复制到s0处,就是将cs:offset s处的数据复制到cs:offsets0处。
(3) 段地址已知在cs中,偏移地址offset s和offset s0已经送入si和di中。
(4) 要复制的数据有多长?mov ax,bx指令的长度为两个字节,即1个字。
程序如下
assume cd:codesg codesg segment s: mov ax,bx ;mov ax,bx的机器码占两个字节 mov si,offset s mov di,offset s0 mov ax.cs:[si] mov cs:[di],aX s0: nop ;nop的机器码占一个字节 nop codesg ends end s