assembly - 无法在 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
时,程序正常执行,但无法在段内定位。
解决方案
如果您想要的是在数据段内的指定偏移量处拥有那些初始化的数组,并且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]
推荐阅读
- php - 整数值在尝试从字符串转换后返回 0
- .net - .NET Framework API, runs when manually started, won't run in IIS?
- javascript - How can i get utc time in Java Script, which is not dependent on client system?
- python - python3 package cannot be imported as non-root user
- java - Finding unique locale from array containing different ISO format of same locale
- sql - 列出不同的案例重复 SQL Server
- github - 为什么 JENKINS 忽略 environment.yml (conda) 中所需的包?
- java - SSL 握手以 javax.net.ssl.SSLException 结尾:readHandshakeRecord
- functional-programming - 函数式语言编译器是否将列表上的“过滤,然后映射”操作优化为单遍?
- powershell - 如何在powershell中打印将一个值作为输入的对象的内容?