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.了解了字元在記憶體中的存儲方式。

