assembly 当我们不使用任何显式指令时,创建的段是彼此重叠还是彼此分离?

jogvjijk  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(112)

在非常简单的汇编语言编程中,每个人都可能知道下面给出的行:

cli
xor ax,ax
mov ss,ax
mov sp,7c00h
push ss
pop es

我非常简单的问题是,当在第3行中我们写mov ss,ax,那么值“0000”将移入堆栈段寄存器ss。我的问题在于理解当我们使用两个指令“push ss”和“pop es”时,那么两个段ss和es是否将被创建并从地址“0000”开始的相同存储器位置开始。(因此相互重叠),或者创建两个单独的段,在它们的第一个位置包含值“0000”(绝对值)。如果后一个条件满足,则将自动创建ss和es(因为我们没有使用任何指令来创建段SSES,例如:)

stack segment stack1
end stack1

extra segment extra1
end extra1

assume stack:stack1 
extra:extra1
qncylg1j

qncylg1j1#

在您的代码中,SSES相互重叠,并指向同一个段。请务必记住,* 段 * 和 * 段寄存器 * 虽然相关,但并不相同。“段”是内存,段寄存器的值是指向相应段的指针的一部分。
将两个段寄存器指向同一段内存是很常见的。没有新的创建,它们只是查看同一段内存。

.data

myString db "Hello",0
myBuffer db 0,0,0,0,0,0

.code

mov ax,@data
mov ds,ax
mov es,ax

mov si,offset myString
mov di,offset myBuffer

mov cx,6
rep movsb ;copy myString to myBuffer

mov ax,4C00h
int 21h   ;exit back to DOS

相关问题