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

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

實驗任務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

2.執行結果截圖:

3.debug裡除錯程式

4.line4位元組段用途:修改字母的顏色。

實驗任務2

1.編寫原始碼

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 di,0 mov cx,5 s1: mov ah,0 mov al,ds:[di] mov bl,10 div bl mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h mov ah,2
mov dl," " int 21h inc di loop s1 mov ax,4c00h int 21h code ends end start

2.執行結果截圖

實驗任務3

1.原始碼

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

2.

問題1:資料如圖

問題2:cs=076c,ss=076b,ds=076a

問題3:data段地址:X-2,stack段地址:X-1

實驗任務4

1.原始碼

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

2.

問題1:0123h 0456h

問題2:cs=076ch,ss=076bh,ds=076ah.

問題3:data段段地址X-2,stack段地址X-1.

問題4:佔16個位元組

3.

實驗任務5

1.原始碼:

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

2.

問題1:data段:0123h 0456h

問題2:cs=076a,ss=076e,ds=076d。

問題3:data段段地址X+3,stack段地址X+4

3.

實驗任務6

第(3)題的程式task5.exe仍然可以正確執行,因為如果不指明入口位置,則程式從所分配的空間開始執行,前2題開頭是資料段,會被當成指令讀入,只有從第(3)題一開始是指令程式碼。

實驗任務7

1.原始碼

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

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

code segment
start:
       mov ax,a
       mov ds,ax
       mov ax,b
       mov es,ax
       mov ax,c
       mov ss,ax
       mov bx,0
       mov cx,8
s:       mov ax,[bx]
        mov ss:[bx],ax
       mov ax,es:[bx]
       add ss:[bx],ax
       inc bx
       loop s
       mov ax,4c00h
       int 21h
code ends
end start

2.

實驗任務8

1.原始碼

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,a
       mov ds,ax
       mov ax,b
       mov bx,0
       mov ss,ax
       mov sp,16
       mov cx,8
s:        push [bx]
       add bx,2
       loop s
       mov ax,4c00h
       int 21h
code ends
end start

2.

實驗總結

通過本次實驗,鞏固了多個段的程式的編寫執行,掌握了其各個段地址之間的聯絡,學會了編寫一些簡單的彙編程式。