关于多个段的编程
本帖最后由 1809228982 于 2019-11-4 16:29 编辑为什么ds段和ss段需要重新给它赋值呢??
(
mov ax, stack
mov ss, ax
mov sp, 10h
mov ax, date
mov ds, ax
)
一开始不是把 assume ds:date, ss:stack, cs:code 吧地址绑定在一起了吗???
而cs段的就不需要??
为什么cs可以找到地址,而ds,和ss缺找不到呢??
assume ds:date, ss:stack, cs:code
date segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
date ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 10h
mov ax, date
mov ds, ax
mov bx, 0
mov cx, 8
s:push
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0:pop
add bx, 2
loop s0
mov ax, 4c00h
int 21h
code ends
end start
一個執行檔載入記憶體中運行, 他會從你 end start 的這個start標號開始, 也就是start標號開始翻譯指令, 翻譯到end start為止.
然而你在data segment 中有預設一些資料, 當程式載入記憶體中, 他並不知道你的資料從哪裡開始, 所以你要指定它正確的地址才能找到你預定的資料
stack segment也是一樣, 只是stack 是保留一段空間當棧, 所以你要把他指定到正確的空間當作棧的操作空間 kikiatw 发表于 2019-11-4 17:24
一個執行檔載入記憶體中運行, 他會從你 end start 的這個start標號開始, 也就是start標號開始翻譯指令, 翻 ...
那是不是说CS段的地址其实是由系统自动分配的,程序一载入就已经分配了的。而ds和ss则需要程序员手动分配地址??
当我把start去掉之后 debug程序,用G命令跳转到代码的部分,cs的值依旧是刚载入程序的那样。
assume ds:date, ss:stack, cs:code
date segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
date ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
mov ax, stack
mov ss, ax
mov sp, 10h
mov ax, date
mov ds, ax
mov bx, 0
mov cx, 8
s:push
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0:pop
add bx, 2
loop s0
mov ax, 4c00h
int 21h
code ends
end
如果把START標號去除, 他會從Code segment開始
如果此時沒有 start標號, 而且你在code segment 定義變量, 他會從變量開始
小甲魚視頻你看到後面就會說到這個了 kikiatw 发表于 2019-11-6 09:24
如果把START標號去除, 他會從Code segment開始
如果此時沒有 start標號, 而且你在code segment 定義變量,...
好的,谢谢
页:
[1]