201983290125彙編語言實驗二

  • 2021 年 11 月 7 日
  • 筆記

1.任務一

 

1-1

彙編並連接task1_1.asm

 

用g命令打斷點,使程式執行至17行停止,查看暫存器的值

 

 (1)ds=076A;

          ss=076B;

          cs=076C;

(2)ds=X-0002;

         ss=X-0001;

 

1-2

 

 (1)ds=076A

          ss=076B;

          cs=076C;

(2)ds=X-0002;

         ss=X-0001;

 

1-3

 

(1)ds=076A

          ss=076C;

          cs=076E;

(2)ds=X-0004;

         ss=X-0002;

 

1-4

 

(1)ds=076C;

          ss=076E;

          cs=076A;

(2)ds=X+0002;

         ss=X+0004;

 

1-5

(1)如果段中的數據佔N個位元組,則程式載入後,該段實際佔有的空間為 (n+15)/16,即對N/16向上取整,因為段大小為16位元組整數倍,不滿的部分也要補足16位元組。

(2)

只有1-4可以執行,原因如下:

start標號表示程式段的開始,end start表示程式段結束,start和end start必須成對出現,如果end start不存在,則忽略start標號,當作預設處理。當程式開頭即為程式入口時,可以預設。

只有1-4的開頭是程式碼段,所以只有1-4可以執行。

 

2.任務2

 程式碼如下:

assume cs:code
code segment
    
    mov ax,0b800h
    mov ds,ax
    mov bx,0f00h
    mov cx,80
p:
    mov ds:[bx],0403h
    inc bx
    inc bx
    loop p

    mov ah,4ch
    int 21h
code ends

 結果如下:

 

3.任務3

程式碼如下

assume cs:code
data1 segment
    db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
data1 ends

data2 segment
    db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0       ; ten numbers
data2 ends

data3 segment
    db 16 dup(0)
data3 ends

code segment
start:
mov ax,data1
mov ds,ax
mov ax,data2
mov es,ax
mov ax,data3
mov ss,ax
mov bx,0
mov cx,10
s:
mov ax,0
add ax,ds:[bx]
add ax,es:[bx]
mov ss:[bx],ax
inc bx
loop s

mov ax,4c00h
int 21h

code ends
end start

未進入程式碼段時的值

 

data1為076a:0000開始的10個單元,data2,data3分別從076b,076c開始,可以看到076c此時全為0

運行後,076c結果如下

 

 變成了data1+data2

 

4.任務4

程式碼如下:

assume cs:code

data1 segment
    dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends 

data2 segment
    dw 8 dup(?)
data2 ends

code segment
start:
    mov ax,data1
    mov ds,ax
    mov ax,data2
    mov ss,ax
    mov cx,8
    mov sp,16
    mov bx,0
s:
    mov ax,[bx]
    push ax
    inc bx
    inc bx
    loop s
    
    mov ah, 4ch
    int 21h
code ends
end start

 進入程式碼段前:

 

程式碼段運行完畢後

 

 

5.任務5

運行程式

 

 執行到25、27行之間

 

 line 19 作用

將data1中記憶體單元值與0dfh即16進位數df進行與運算,而df化成二進位為11011111,與運算將第6位原本的數字變成0,

大寫字母ascii範圍01000001~01011010,小寫字母為01100001-01111010,所以將小寫字母第6位的1變更成0,即可小寫轉大寫,

而大寫字母原本的0不變,所以第19行將所有字母變成大寫。

 

改為db 5 dup(2)

結果如下:

 

 一個字元佔一個字,即2位元組,低位位元組表示ascii嗎,高位位元組表示字元參數,高4位底色,第4位字元本身顏色。

 

6.任務6

assume cs:code, ds:data

data segment
    db 'Pink Floyd      '
    db 'JOAN Baez       '
    db 'NEIL Young      '
    db 'Joan Lennon     '
data ends

code segment
start:
   mov ax,data
   mov ds,ax
   mov cx,4
   mov bx,0
s:
   mov dx,cx
   mov cx,4
   mov si,0
p:
   mov al,ds:[bx+si]
   or al,00100000B
   mov ds:[bx+si],al
   inc si
   loop p
add bx,16
mov cx,dx
loop s
   mov ah, 4ch
   int 21h
code ends
end start

 

 

 

 

7.任務7

 

assume cs:code, ds:data, es:table

data segment
    db '1975', '1976', '1977', '1978', '1979' 
    dw  16, 22, 382, 1356, 2390
    dw  3, 7, 9, 13, 28 
data ends

table segment
    db 5 dup( 16 dup(' ') )  ;
table ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax
    mov bx,0
    mov si,0
    mov cx,5
p:
    mov ax,ds:[bx]
    mov es:[si],ax
    mov ax,ds:[bx+2]
    mov es:[si+2],ax
    add bx,4
    add si,16
    loop p
    mov bx,20
    mov cx,5
    mov si,5
s:
    mov ax,0
    mov es:[si+2],ax
    mov ax,ds:[bx]
    mov es:[si],ax
    add bx,2
    add si,16
    loop s
    mov bx,30
    mov cx,5
    mov si,10
q:
    mov ax,ds:[bx]
    mov es:[si],ax
    add bx,2
    add si,16
    loop q
    mov cx,5
    mov si,0
r:
    mov ax,es:[si+5]
    mov dx,es:[si+7]
    div word ptr es:[si+10]
    mov es:[si+13],ax
    add si,16
    loop r



    mov ah, 4ch
    int 21h
code ends
end start
assume cs:code, ds:data, es:table

data segment
    db '1975', '1976', '1977', '1978', '1979' 
    dw  16, 22, 382, 1356, 2390
    dw  3, 7, 9, 13, 28 
data ends

table segment
    db 5 dup( 16 dup(' ') )  ;
table ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax
    mov bx,0
    mov si,0
    mov cx,5
p:
    mov ax,ds:[bx]
    mov es:[si],ax
    mov ax,ds:[bx+2]
    mov es:[si+2],ax
    add bx,4
    add si,16
    loop p
    mov bx,20
    mov cx,5
    mov si,5
s:
    mov ax,0
    mov es:[si+2],ax
    mov ax,ds:[bx]
    mov es:[si],ax
    add bx,2
    add si,16
    loop s
    mov bx,30
    mov cx,5
    mov si,10
q:
    mov ax,ds:[bx]
    mov es:[si],ax
    add bx,2
    add si,16
    loop q
    mov cx,5
    mov si,0
r:
    mov ax,es:[si+5]
    mov dx,es:[si+7]
    div word ptr es:[si+10]
    mov es:[si+13],ax
    add si,16
    loop r



    mov ah, 4ch
    int 21h
code ends
end start

 

 運行前後:

 

 

 

 

 實驗總結:

1.通過本次實驗,掌握了循環loop的用法。

2.了解了通過與、或運算改變字母大小寫的方法

3.了解了字元在記憶體中的存儲方式。

 

 

 

 

 

 

 

 

 

 

 

 

 

         

 

Tags: