汇编语言操作符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

发布日期:

所属分类: 易语言 标签: