1. 程式人生 > 實用技巧 >實驗三 多個段的彙編源程式編寫與除錯

實驗三 多個段的彙編源程式編寫與除錯

實驗3 多個段的彙編源程式編寫與除錯

一、實驗目的

  1、理解和掌握將資料、程式碼、棧放入不同邏輯段的程式的編寫和除錯

  2、理解具有多個段的彙編源程式對應的目標程式執行時,記憶體的分配方式

  3、掌握大小寫字元的轉換辦法、數字字元和數值之間的轉換方法

  4、理解並掌握各種定址方式的靈活應用

  5、掌握彙編指令loop,and,or,div,mul的用法

二、實驗準備

  複習教材chapter6-8章

三、實驗結論

  1、實驗任務1

  源程式如下:

assume cs:code, ds:data
data segment
db 'Nuist'
db 5 dup(2)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800H
mov es, ax
mov cx, 5
mov si, 0
mov di, 0f00h
s: mov al, [si]
and al, 0dfh
mov es:[di], al
mov al, [5+si]
mov es:[di+1], al
inc si
add di, 2
loop s
mov ah, 4ch
int 21h
code ends
end start

  使用masm、link對task1.asm進行彙編、連結,得到可執行檔案task1.exe執行結果如下

  

  使用debug工具進行除錯,執行到程式返回前,即line27之前結果如下:

  

  

  修改line4裡面5個位元組單元值,重新進行彙編、連結、執行,觀察結果

db 5 dup(2) 
--> 改成:
db 2,3,4,5,6

  

  猜測:這裡的數值的作用主要是向視訊記憶體中寫入顏色資料

  2、實驗任務2

  已知資料段中定義的位元組資料如下:

data segments
  db 23, 50, 66, 71, 35
data ends

  編寫程式,在螢幕上以十進位制整數形式列印輸出這5個兩位數。

  編寫原始碼如下:

assume cs:code,ds:data
data segment
    db 23,50,66,71,35
data ends
code segment
start:
    mov ax,data
    mov ds,ax

    mov cx,5
    mov si,0
 
 s: mov ah,0
    mov al,[si]
    mov bl,10
    div bl
    mov bx,ax
 
    mov ah,2
    or bl,30h
    mov dl,bl
    int 21h
     
    mov ah,2
    or bh,30h
    mov dl,bh
    int 21h

    mov ah,2
    mov dl,','
    int 21h

    inc si
    loop s

    mov ax,4c00h
    int 21h
code ends
end start

  執行結果如下

  

  3、實驗任務3

  task3.asm原始碼如下:

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
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

  執行結果如下:

  

  

  此時檢視資料

  

  程式返回前data段中的資料如上圖所示

  返回前cs=076C ss=076B ds=076A

  程式載入後code段的地址為X,則data段的地址為:X-1,stack段的段地址為:X-2

  4、實驗任務4

  原始碼如下:

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

  執行結果如下

  

  

  此時檢視資料

  

  data資料段中的資料如上圖所示

  程式返回前,cs=076C、ss=076B、ds=076A

  code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1

  該段實際佔有的空間為([N/16]+1)*16

  5、實驗任務5

  原始碼如下

assume cs:code, ds:data, ss:stack

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0,0
stack ends
end start

  執行結果如下:

  

 

  此時檢視資料

  

  data資料段中的資料如上圖所示

  程式返回前cs=076A,ss=076E,ds=076D

  code段的段地址是X,則data段的段地址為X+3,stack段的段地址是X+4

  6、實驗任務6

  只有task5.exe可以正確執行,應為在task5.asm中data段和stack段是定義在程式段的後面的,編譯器會順序執行

  7、實驗任務7

  原始碼如下:

assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends

b segment
  db 1,2,3,4,5,6,7,8
b ends

c1 segment   ; 在整合軟體環境中,請將此處的段名稱由c→改為c1或其它名稱
  db 8 dup(0)
c1 ends

code segment
start:
       mov ax,a
       mov es,ax
       mov ax,c1
       mov ds,ax
       mov bx,0
       mov cx,8
  s1:  mov ax,es:[bx]
       add [bx],ax
       add bx,2
       loop s1
       mov ax,b
       mov es,ax
       mov bx,0
       mov cx,8
  s2:  mov ax,es:[bx]
       add [bx],ax
       add bx,2
       loop s2
       mov ax,4c00h
       int 21h
code ends
end start

  執行結果如下:

  

  

  

  

  8、實驗任務8

  原始碼如下:

assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
  dw 8 dup(0)
b ends

code segment
start: 
       mov ax,b
       mov ss,ax
       mov sp,10h
       mov ax,a
       mov ds,ax
       mov bx,0
  s:   push[bx]
       add bx,2
       loop s
       mov ax,4c00h
       int 21h
code ends
end start

  執行結果如下: