實驗二


1. 實驗任務1

  • 任務1-1
    • task1_1.asm源碼
      assume ds:data, cs:code, ss:stack
      
      data segment
          db 16 dup(0)
      data ends
      
      stack segment
          db 16 dup(0)
      stack ends
      code segment
      start:
          mov ax, data
          mov ds, ax
      
          mov ax, stack
          mov ss, ax
          mov sp, 16
      
          mov ah, 4ch
          int 21h
      code ends
      end start
    • 調試到line17結束、line19之前截圖

    • 問題回答

      ① 在debug中將執行到line17結束、line19之前,記錄此時:寄存器(DS) = __076A__, 寄存器(SS) =__076B__, 寄存器(CS) = __0031__
      ② 假設程序加載后,code段的段地址是X,則,data段的段地址是__X-20H__, stack的段地址是__X-10H__。
  • 任務1-2
    • 任務task1_2.asm源碼
      assume ds:data, cs:code, ss:stack
      
      data segment
          db 4 dup(0)
      data ends
      
      stack segment
          db 8 dup(0)
      stack ends
      code segment
      start:
          mov ax, data
          mov ds, ax
      
          mov ax, stack
          mov ss, ax
          mov sp, 8
      
          mov ah, 4ch
          int 21h
      code ends
      end start
    • task1_2調試到line17結束、line19之前觀察寄存器DS, CS, SS值的截圖

    • 問題回答

      ① 在debug中將執行到line17結束、line19之前,記錄此時:寄存器(DS) = __076A__, 寄存器(SS) =__076B__, 寄存器(CS) = __076C__
      ② 假設程序加載后,code段的段地址是X,則,data段的段地址是__ X-20H __, stack的段地址是__ X-10H __
  • 任務1-3
    • 任務task1_3.asm源碼
      assume ds:data, cs:code, ss:stack
      
      data segment
          db 20 dup(0)
      data ends
      
      stack segment
          db 20 dup(0)
      stack ends
      code segment
      start:
          mov ax, data
          mov ds, ax
      
          mov ax, stack
          mov ss, ax
          mov sp, 20
      
          mov ah, 4ch
          int 21h
      code ends
      end start
    • task1_3調試到line17結束、line19之前觀察寄存器DS, CS, SS值的截圖
    • 問題回答
      在debug中將執行到line17結束、line19之前,記錄此時:寄存器(DS) = __076A__, 寄存器(SS) =__076C__, 寄存器(CS) = __076E__

      ② 假設程序加載后,code段的段地址是X,則,data段的段地址是__ X-40H __, stack的段地址是__ X-20H __。

  • 任務1-4
    • 任務task1_4.asm源碼
      assume ds:data, cs:code, ss:stack
      
      data segment
          db 20 dup(0)
      data ends
      
      stack segment
          db 20 dup(0)
      stack ends
      code segment
      start:
          mov ax, data
          mov ds, ax
      
          mov ax, stack
          mov ss, ax
          mov sp, 20
      
          mov ah, 4ch
          int 21h
      code ends
      end start
    • task1_4調試到line17結束、line19之前觀察寄存器DS, CS, SS值的截圖

    • 問題回答

      ① 在debug中將執行到line9結束、line11之前,記錄此時:寄存器(DS) = __076C__, 寄存器(SS) =
      __076E__, 寄存器(CS) = __076A__
      ② 假設程序加載后,code段的段地址是X____,則,data段的段地址是__X+20H__, stack的段地址是
      __X+40H__。

       

  • 任務1-5

基於上述四個實驗任務的實踐、觀察,總結並回答:

① 對於如下定義的段,程序加載后,實際分配給該段的內存空間大小是 __ceil(N/16)*16__。

xxx segment
db N dup(0)
xxx ends

② 如果將程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,偽指令 end start 改成end , 哪一個程序仍然可以正確執行?結合實踐觀察得到的結論,分析、說明原因。

解:只有task1_4.asm可以執行。將end start替換成end意味着程序未指定開始位置,整個代碼段(包括數據段)都被當做執行代碼來執行,而執行數據段中的數據自然會出錯。

2. 實驗任務2

  • 匯編源代碼
    assume cs:code
    
    code segment
    start:
        mov ax,0b800h
        mov ds,ax
        mov bx,0f00h
        mov cx,80
    
    s:  mov [bx],0403h
        add bx,2
        loop s
    
        mov ah, 4ch
        int 21h
    code ends
    end start
  • 運行結果截圖

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 cx,10
       mov bx,0
       mov dx,0
    
    s: mov dx,0
       mov ax,data1
       mov ds,ax
       add dl,[bx]
    
       mov ax,data2
       mov ds,ax
       add dl,[bx]
    
       mov ax,data3
       mov ds,ax
       mov [bx],dl
       
       inc bx
    
       loop s
    
       mov ax,4c00h
       int 21h
    
    code ends
    end start
  • debug中加載、反匯編、調試截圖

     
    要求給出,在數據項依次相加之前,查看邏輯段data1, data2, data3對應的內存空間數據原始值的debug命令和截圖

    以及,依次相加之后,查看邏輯段data1, data2, data3對應的內存空間數據原始值的debug命令和截圖

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 sp,10h
    
        mov bx,0
        mov cx,8
    
    s:  push ds:[bx]
        add bx,2
    
        loop s
        
        mov ah, 4ch
        int 21h
    code ends
    end start

  • debug中加載、反匯編、調試截圖

    要求給出,在程序退出前,使用d命令查看數據段data2對應的內存空間的截圖。 

5. 實驗任務5

 

  • task5.asm源碼
    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
  • 運行結果截圖
  • 使用debug工具對程序進行調試,使用g命令一次性執行到程序返回前(即ine25執行之后、line27

    執行之前)的截圖

  • 源代碼中line19的作用是?源代碼中dataline4的字節數據的用途是?

    解:line19 小寫變成大寫;line4 設置字體顏色。

6. 實驗任務6

  • task6.asm源代碼
    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 bx,0
       mov cx,4
      
    s: mov al,[bx]
       or  al,20h
       mov [bx],al
       add bx,16
       loop s
    
       mov ah, 4ch
       int 21h
    code ends
    end start

  • debug中加載、反匯編、調試截圖

    要求給出,在程序退出前,使用d命令查看數據段data對應的內存空間的截圖。


7. 實驗任務7

  • task7.asm源碼
    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 si,0
        mov di,0
        mov bx,0
        mov cx,5
    
        mov sp,0
    
     s: mov ax,[si]
        mov es:[di],ax
        mov ax,[si+2]
        mov es:[di+2],ax
    
        mov ax,[bx+20]
        mov es:[di+5],ax
        mov dx,0
        mov es:[di+7],dx
    
        push cx
        mov cx,[20+10+bx]
        mov es:[di+10],cx
    
        div cx
        pop cx
    
        mov es:[di+0dh],ax
    
        add si,4
        add di,16
        add bx,2
    
        loop s
    
        mov ah, 4ch
        int 21h
    code ends
    end start

  • 調試截圖
    • 查看table段原始數據信息截圖

    • debug中運行到程序退出之前,使用d命令查看table段對應的內存空間的截圖,確認信息是否按要求結構化地寫入到指定內存



 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM