匯編入門學習筆記 (五)—— 包含多個段的程序
參考: 《匯編語言》 王爽 第6章
1.在代碼中使用數(shù)據(jù)。
- assumecs:code
- codesegment
- dw0123h,0456h,0789h,0defh
- movax,0
- movbx,0
- movax,4c00H
- int21h
- codeends
- end
dw 表示定義字型數(shù)據(jù),db 表示定義字節(jié)型數(shù)據(jù)。
上面代碼編譯連接,用debug調(diào)試,-u cs:0 查看匯編代碼,發(fā)現(xiàn)沒有看到 mov ax,0 mov bx,0 等。直接運行不正常。因計算機不知道那些是數(shù)據(jù)那些是代碼。如果-u cs:8 就可以看到mov ax,0 mov bx,0 等。
正確方法,要加上程序入口
- assumecs:code
- codesegment
- dw0123h,0456h,0789h,0defh
- start:movax,0
- movbx,0
- movax,4c00H
- int21h
- codeends
- endstart
start可以改成其他的名字,只要入口處和end 后面的一樣就行了。
2.在代碼中使用棧
例子:交換0123H 跟 0456H
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 申請了棧的空間
sp 30H 設置 棧頂?shù)钠鹗嘉恢?/p>
- assumecs:code
- codesegment
- dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
- dw0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- start:movax,cs
- movss,ax
- movsp,30h
- pushcs:[0]
- pushcs:[2]
- popcs:[0]
- popcs:[2]
- movax,4c00h
- int21h
- codeends
- endstart
3.將數(shù)據(jù)、代碼、棧放入不同的段中
例子:將數(shù)據(jù)段中的數(shù)據(jù),倒敘存放
- assumecs:code,ds:data,ss:stack
- datasegment
- dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
- dataends
- stacksegment
- dw0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- stackends
- codesegment
- start:movax,data
- movds,ax
- movax,stack
- movss,ax
- movsp,20h
- movbx,0
- movcx,8
- s:push[bx]
- addbx,2
- loops
- movbx,0
- movcx,8
- s0:pop[bx]
- addbx,2
- loops0
- movax,4c00h
- int21h
- codeends
- endstart
這里定義了三個段,數(shù)據(jù)段,棧段,代碼段。ds,ss的值需要在代碼段中指定。
評論