SpringBoot——日誌及原理
一、實驗目的
1. 理解和掌握將資料、程式碼、棧放入不同邏輯段的程式的編寫和除錯
2. 理解具有多個段的彙編源程式對應的目標程式執行時,記憶體分配方式
3. 掌握大小寫字元的轉換方法、數字字元和數值之間的轉換方法
4. 理解並掌握各種定址方式的靈活應用
5. 掌握彙編指令loop, and, or,div, mul的用法
二、實驗準備
複習教材chapter 6-8章。
三、實驗內容
1.實驗任務1
assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) 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
使用masm、link對task1.asm進行彙編、連結,得到可執行檔案task1.exe,執行並觀察結果。
使用debug工具對程式進行除錯,執行到程式返回前,即line27之前,觀察結果。
修改line4裡5個位元組單元的值,重新彙編、連結、執行,觀察結果。
基於觀察,分析、猜測這裡的數值作用是什麼?
這裡的數值作用是更改字元的顏色。
2.實驗任務2
assume cs:code,ds:data data segment db 23,50,66,71,35 data ends code segment start: mov ax,data mov ds,ax mov di,0 mov cx,5 s: mov ah,0 mov al,ds:[di] mov bl,10 div bl mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h mov ah,2 mov dl," " int 21h inc di loop s mov ax,4c00hint 21h code ends end start
3.實驗任務3
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
反彙編檢視data段中資料及反彙編除錯的截圖
①data段中的資料為:0123H 0456H 0789H 0ABCH 0DEFH 0FEDH 0CBAH 0987H
②cs=cs=076CH,ss=076BH,ds=076AH
③設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1
4.實驗任務4
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
反彙編除錯截圖
①data段中的資料為:0123H 0456H
②cs=cs=076CH,ss=076BH,ds=076AH
③設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1
④程式載入後,該段實際佔有空間為N+16個位元組
5.實驗任務5
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
①data段中的資料為:0123H 0456H
②cs=cs=076AH,ss=076EH,ds=076DH
③設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4
6.實驗任務6
修改指令後執行截圖
第三個程式可以正確執行,因為預設進入的就是code段,第一第二個程式都將data段和stack段放在code段的前面,而第三個程式將data段和stack段放在code段後面,所以只有第三個程式可以正確執行。
7.實驗任務7
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c1 segment db 8 dup(0) c1 ends code segment start: mov ax, a mov ds, ax mov ax, b mov es, ax mov cx, 8 mov di, 0 s: mov bx, [di] add bx, es:[di] push ds mov ax, c1 mov ds, ax mov [di], bx pop ds inc di loop s mov ax, 4c00h int 21h code ends end start
8.實驗任務8
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,a mov ds,ax mov di,0 mov ax,b mov ss,ax mov sp,10h mov cx,8 s: push [di] add di,2 loop s mov ax,4c00h int 21h code ends end start