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 __。
- 任務task1_2.asm源碼
- 任務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 __。
- 任務task1_3.asm源碼
- 任務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__。
- 任務task1_4.asm源碼
- 任務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的作用是?源代碼中data段line4的字節數據的用途是?
解: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段對應的內存空間的截圖,確認信息是否按要求結構化地寫入到指定內存
- 查看table段原始數據信息截圖