1. 程式人生 > 其它 >實驗二 多個邏輯段的彙編程式編寫與除錯

實驗二 多個邏輯段的彙編程式編寫與除錯

實驗任務1:

  任務1-1:

  

  debug中將執行到line17結束、line19之前,記錄此時:暫存器(DS) = 076A, 暫存器(SS) =076B,暫存器(CS) =076C。(此時以每次16個位元組分配記憶體。)

  假設程式載入後,code段的段地址是X,則,data段的段地址是x-0002hstack的段地址是x-0001h

  任務1-2:

  

  在debug中將執行到line17結束、line19之前,記錄此時:暫存器(DS) = 076A, 暫存器(SS) =076B,暫存器(CS) =076C。(此時以每次16個位元組分配記憶體。)

  假設程式載入後,code段的段地址是X,則,data段的段地址是x-0002hstack的段地址是x-0001h

  任務1-3:

  

  在debug中將執行到line17結束、line19之前,記錄此時:暫存器(DS) = 076A, 暫存器(SS) =076C,暫存器(CS) =076E。(段大小是16位元組的整數倍,但16位元組又不夠,於是分配了32位元組。)

  假設程式載入後,code段的段地址是X,則,data段的段地址是x-0004hstack的段地址是x-0002h

  任務1-4:

  

  ① 在debug中將執行到line9結束、line11之前,記錄此時:暫存器(DS) = 076C, 暫存器(SS) =076E, 暫存器(CS) = O76A

  ② 假設程式載入後,code段的段地址是X,則,data段的段地址是X+0002hstack的段地址是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