1. 程式人生 > >【組合語言】——第六章課後總結

【組合語言】——第六章課後總結

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:30h
mov 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連結