首页 > 解决方案 > 无法在 emu8086 中使用“ORG”

问题描述

用emu8086编译下面的代码,程序会一直往数据段填数字,不执行org.

data segment 
    Count db 0AH 
    org 3500h
    StuId db 1,2,3,4,5,6,7,8,9,0   
    org 3600h
    Dest db 10 dup(0)
data ends
code segment 
    assume cs:code, ds:data
start:
    mov ax, data
    mov ds, ax
    mov cl, Count
    mov ch, 00h   
    lea si, STuId
    lea di, Dest
next:
    mov al, [si]
    mov [di], al 
    inc si
    inc di
    loop next
    mov ah, 4ch
    int 21h
code ends
    end start

当我删除org时,程序正常执行,但无法在段内定位。

标签: assemblyx86-16directiveemu8086

解决方案


如果您想要的是在数据段内的指定偏移量处拥有那些初始化的数组,并且ORG对您不起作用,那么只需通过用零填充空白来弥补差距:

data segment 
    Count db 0AH 
          db 3500h-1 dup(0)
    StuId db 1,2,3,4,5,6,7,8,9,0
          db 3600h-(3500h+10) dup(0)
    Dest  db 10 dup(0)
data ends

上述代码的一个缺点是您的程序变得非常大。另一种解决方案是将数组存储在代码段中,然后将其元素复制到数据段的偏移量 3500h。您的副本可以像以前一样保留。
也可以将两个副本合并到一个循环中,或者根本不复制到 3500h,如果您只需要 3600h 处的最终数组。既然所有这些都是关于学习汇编语言的,你为什么不都尝试一下呢!

data segment 
    Count dw 10
data ends
code segment 
  start:
    mov ax, data
    mov ds, ax

    xor bx, bx
More:
    mov al, cs:StuId[bx]   <<<< cs: segment override prefix
    mov [3500h+bx], al
    inc bx
    cmp bx, 10
    jb  More
    
    mov cx, Count
    mov si, 3500h
    mov di, 3600h
next:
    mov al, [si]
    mov [di], al 
    inc si
    inc di
    loop next
    mov ah, 4Ch
    int 21h

    StuId db 1,2,3,4,5,6,7,8,9,0   
code ends
end start

mov al, cs:StuId[bx]使用cs:段覆盖前缀。这告诉 CPU 从代码段中的StuId数组中获取元素。如果没有该前缀,将从数据段中获取值。mov al, StuId[bx]


推荐阅读