【組合語言】——第六章課後總結
阿新 • • 發佈:2018-11-26
1.在程式碼段中使用資料
assume cs:code code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h mov bx,0 mov ax,0 movcx,9 s:addax,cs:[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end
dw的含義是定義字型資料(define word),使用dw定義 了8個字型資料,他們所佔的記憶體空間大小為16個位元組。
程式碼段偏移地址為0,2,4,6……,即CS:0,CS:2,CS:4,CS:6……CS:E。
程式中,用bx存放加2遞增的偏移地址,用迴圈來進行累加。在迴圈開始前,設定(bx)=0,cs:bx指向第一個資料所在的字單元。每次迴圈中(bx)=(bx)+2,cs:bx指向下一個資料所在單元。
1.用start:放在程式開始處
2.在最後一個end處加上start(start只是標號,也可以自定字元)
end除了通知編譯器程式結束,還通知編譯器程式的入口在什麼地方
end start指明程式的入口,被轉化為入口地址,儲存在可執行檔案的描述資訊中,載入時程式從描述資訊中讀到入口地址,設定CS:IP
程式框架:
assume cs:code code segment .....資料 start .....程式碼 code ends end start
2.在程式碼段中使用棧
assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;用dw定義16個字型資料,在程式載入後,將取得16個字的記憶體空間,0~f,存放這16個數據 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;在此處預留了32個位元組作為棧,10~2f,在後面的程式將這段空間當作棧來使用 start: mov ax,cs mov ss,ax mov sp,30h ;將棧頂ss:sp指向cs:30hmov bx,0 mov cx,8 s: push cs:[bx] add bx,2 loop s ;將程式碼段0~15單元的8個字型資料依次入棧 mov bx,0 mov cx,8 s0: pop cs:[bx] add bx,2 loop s0 ;依次出棧8個字型資料到程式碼段0~15單元中 codesg ends end start
我們將cs:10~cs:2F的記憶體空間當作棧來用,初始狀態下為空,所以ss:sp要指向棧底,即cs:30h。
3.將資料、程式碼、棧放入不同的棧
assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 stack ends code segment start:mov ax,stack mov ss,ax mov sp,20h mov ax,data mov ds,ax mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s mov bx,0 mov cx,8 s0: pop [bx] add bx,2 loop s0 mov ax,4c00h int 21h code ends end start
1、不同段要有不同段名
2、段名相當於一個標號,代表了段地址,是數字形式而非暫存器形式,所以 mov ds,data錯誤
3、assume是偽指令,cs:code,ds:data,ss:stack,不會將相應暫存器和段code、stack、data連結