實驗二 多個邏輯段的彙編程式編寫與除錯
實驗任務1:
任務1-1:
在debug中將執行到line17結束、line19之前,記錄此時:暫存器(DS) = 076A, 暫存器(SS) =076B,暫存器(CS) =076C。(此時以每次16個位元組分配記憶體。)
假設程式載入後,code段的段地址是X,則,data段的段地址是x-0002h, stack的段地址是x-0001h。
任務1-2:
在debug中將執行到line17結束、line19之前,記錄此時:暫存器(DS) = 076A, 暫存器(SS) =076B,暫存器(CS) =076C。(此時以每次16個位元組分配記憶體。)
假設程式載入後,code段的段地址是X,則,data段的段地址是x-0002h,stack的段地址是x-0001h。
任務1-3:
在debug中將執行到line17結束、line19之前,記錄此時:暫存器(DS) = 076A, 暫存器(SS) =076C,暫存器(CS) =076E。(段大小是16位元組的整數倍,但16位元組又不夠,於是分配了32位元組。)
假設程式載入後,code段的段地址是X,則,data段的段地址是x-0004h,stack的段地址是x-0002h。
任務1-4:
① 在debug中將執行到line9結束、line11之前,記錄此時:暫存器(DS) = 076C, 暫存器(SS) =076E, 暫存器(CS) = O76A
② 假設程式載入後,code段的段地址是X,則,data段的段地址是X+0002h, stack的段地址是x+0004h
任務1-5:
① 按資料量模16的結果向上取整作為整個段的記憶體空間。
②task1_4可以正常執行。因為用了end start之後,程式就從start的地方開始執行,如果不用end start,就會從頭開始執行,那除了4之外的就會出錯。
實驗任務二:
assume cs:code
code segment
start:
mov ax,0b800h
mov ds,ax
mov bx,0f00h
mov cx,80
s:
mov ds:[bx],0403h
inc bx
inc bx
loop s
mov ah,4ch
int 21h
code ends
end start
實驗任務3:
相加之前data1中的資料:
相加之前data2中的資料:
相加之前data3中的資料:
相加之後data1中的資料:
相加之後data2中的資料:
相加之後data3中的資料:
反彙編截圖:
實驗任務4:
assume cs:code data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(0) data2 ends stack segment db 16 dup(0) stack ends code segment start: mov ax,data1 mov ds,ax mov ax,stack mov ss,ax mov sp,16 mov bx,0 mov cx,8 s1: push ds:[bx] inc bx inc bx loop s1 mov bx,16 mov cx,8 s2: pop ds:[bx] inc bx inc bx loop s2 mov ah, 4ch int 21h code ends end start
實驗任務5:
assume cs:code, ds:data data segment db 'Nuist' db 2, 3, 4, 5, 6 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
19行的作用:將原資料和0dfh相與,即和000011011111相與,讓第6位變為0,即減小了32。所以是將字母統一變成大寫。
Line4的作用是給字母新增上不同的顏色。
實驗任務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 si,0 s: mov al,[si] or al,00100000B mov [si],al mov al,[si+16] or al,00100000B mov [si+16],al mov al,[si+32] or al,00100000B mov [si+32],al mov al,[si+48] or al,00100000B mov [si+48],al inc si loop s mov ah, 4ch int 21h code ends end start
實驗任務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 bp,0 mov si,20 mov cx,5 s: mov ax,ds:[bx] mov es:[bp],ax mov ax,ds:[bx+2] mov es:[bp+2],ax mov ax,ds:[si] mov es:[bp+5],ax mov word ptr es:[bp+7],0 mov ax,ds:[si+10] mov es:[bp+10],ax mov ax,ds:[si] mov dl,ds:[si+10] div dl mov es:[bp+13],al mov byte ptr es:[bp+14],0 add bx,4 add bp,16 add si,2 loop s mov ah, 4ch int 21h code ends end start