2023年 11 月 27日
實驗三迴圈程式設計
一.實驗目的
1. 學習除錯程式,查詢邏輯錯誤;
2. 掌握迴圈程式設計的方法;
3. 掌握正確分配與使用暫存器。
二.實驗內容與要求
題目1:陣列中是一組無符號數,將最小數放在m單元中,經過彙編後,形成.exe檔案,先用g=0命令執行程式,用-d命令檢視m單元的內容,會發現結果不正確。
用單步執行命令t查詢程式中的邏輯錯誤。
dseg segment
msg db 13, 15, 7, 25, 24
m db ?
dseg ends
cseg segment
assume cs: cseg, ds: dseg
start: mov ax, dseg
mov ds, ax
mov cx, 4
mov al, msg
mov si, offset msg+1
l1: cmp al, [si]
jb next
mov al, [si]
next: loop l1
mov m, al
mov ax, 4c00h
int 21h
cseg ends
end start
(1) 程式說明:這個程式的目的是要在13, 15, 7, 25, 24中找到最小數,並且放到m單元中。
(2) 除錯說明:執行無問題
(3) 錯誤問題:結果中m單元的內容是錯誤的,此時m為13,但真實值應為6
解決辦法: 該程式的迴圈是乙個死迴圈,無法將每個數都進行比較,因此,需要每次迴圈時位址+1才能將每個數進行比較,所以需要在迴圈上加「inc si」。
(4) 修改後程式及執行結果:
dseg segment
msg db 13, 15, 7, 25, 24
m db ?
dseg ends
cseg segment
assume cs: cseg, ds: dseg
start: mov ax, dseg
mov ds, ax
mov cx, 4
mov al, msg
mov si, offset msg+1
l1: cmp al, [si]
jb next
mov al, [si]
next: inc si
loop l1
mov m, al
mov ax, 4c00h
int 21h
cseg ends
end start
題目2:試編制乙個組合語言程式,求出首位址為data的10個無符號字陣列中的最小偶數,把它存放在ax中。(注意:無符號數)
data word 0141h, 0ae00h,07b4h, 0a508h, 0691h,
word 0870h, 7542h, 0081h, 0916h, 0017h
(1) 設計思路:本程式需要在10個無符號數中尋找最小的偶數,所以該程式有兩個關鍵之處:最小和偶數,所以需要兩次判斷,最後把結果放在ax中。
(2) 程式設計圖:
(3) 程式說明:
dseg segment
data dw 0141h,0ae00h,07b4h,0a508h,0691h,0870h,7542h,0081h,0916h,0017h
dseg ends
cseg segment
assume ds:dseg,cs:cseg
start: mov ax,dseg
mov ds,ax
mov cx,9迴圈次數為9
mov ax,data取data的首位址放在ax中
mov si,offset data+2取data的第二號位址放在si中
l1: test ax,01h判斷ax中的數是奇數還是偶數
jnz l2不等於0即為奇數,跳到l2位址
test word ptr [si],01h判斷[si]中的數是奇數還是偶數
jnz next奇數跳到next位址
cmp ax,[si比較ax與[si]
jb nextax小於[si],跳到next位址
l2: mov ax,[siax與[si]進行交換
next: add si,2si+2,取下個數字址
loop l1l1進行迴圈
mov ax,4c00h退出
int 21h
cseg ends
end start
(4) 執行結果
實驗四分支程式設計
一.實驗目的:
1、掌握分支程式的結構。
2、掌握分支程式的設計、除錯方法。
二.實驗內容:
題目1:有10個數,統計正數的個數,存放在變數m中。經過彙編後,形成.
exe檔案,先用g=0命令執行程式,用-d命令檢視m單元的內容,會發現結果不正確。用單步執行命令t查詢程式中的邏輯錯誤,注意每一次迴圈中al暫存器中的值變化是否正確(al暫存器中存放正數的個數)
dseg segment
msg db 4, -2, -6, 0, 5, 67, 8, -3, 5, 6
m db ?
dseg ends
cseg segment
assume cs: cseg, ds: dseg
start: mov ax, dseg
mov ds, ax
mov cx, 10
mov al, 0
lea si, msg
l1: mov bl, [si]
cmp bl, 0
jbe next
inc al
next: inc si
loop l1
mov m, al
mov ax, 4c00h
int 21h
cseg ends
end start
(1) 程式說明:這個程式的目的是要在4, -2, -6, 0, 5, 67, 8, -3, 5, 6中找出正數的個數。
(2) 除錯說明:執行無問題
(3) 錯誤問題:m單元中的內容是錯誤的,此時m為9,但真實值應為6
解決辦法:該程式不應用無符號數的跳轉,因此,需要把jbe改為jle
(4) 修改後的程式及執行結果
dseg segment
msg db 4, -2, -6, 0, 5, 67, 8, -3, 5, 6
m db ?
dseg ends
cseg segment
assume cs: cseg, ds: dseg
start: mov ax, dseg
mov ds, ax
mov cx, 10
mov al, 0
lea si, msg
l1: mov bl, [si]
cmp bl, 0
jle next
inc al
next: inc si
loop l1
mov m, al
mov ax, 4c00h
int 21h
cseg ends
end start
題目2:假設有一組資料:5,-4,0,3,100,-51請編一程式,判斷:
每個數大於0,等於0,還是小於0;並將最終結果存於以result為儲存的位元組單元中,(result db 6 dup(?))
即: 1 當x>0
y= 0 當x=0
-1 當x<0
程式設計提示:
1、首先將原始資料裝入起始位址為xx的位元組儲存單元中。
2、其中判斷部分可採用cmp指令,得到乙個分支結構,分別輸出「y=0」, 「y=1」, 「y=-1」。將結果存入result的相應單元
3、程式中存在乙個迴圈結構,迴圈6次,呼叫6次分支結構後結束。
(1)設計思路:該實驗主要的兩大步就是「與0比較」和「將結果存入result的相應單元」,因此,需要用指標來實現。
(2)程式設計圖
(3)程式說明:
dseg segment
msg db 5, -4, 0, 3, 100, -51
result db 6 dup(?)
dseg ends
cseg segment
assume cs:cseg, ds:dseg
start: mov ax,dseg
mov ds,ax
mov cx,6迴圈6次
lea si,msg取msg的首位址放在si中
lea di,result取result的首位址放在result中
l1:mov bl,[si把si的內容放入bl中
cmp bl,0比較bl與0的大小
jl l3bl小於0,跳到l3位址
cmp bl,0比較bl與0的大小
組合語言程式設計實驗報告
實驗室 s318 最後一次實驗時間 2010 年 5 月18 日 第12周星期二1 2節 學院 電腦科學與技術學院 專業 電腦科學與技術 實驗一實驗題目 認識tddebug整合環境 實驗目的 1.熟悉匯程式設計序的開發過程。2.認識tddebug整合操作軟體。3.掌握在tddebug整合環境中編輯 ...
組合語言程式設計實驗報告二
1 實驗目的 1 加深對迴圈結構的理解。2 掌握迴圈程式的設計方法。3 學習子程式的定義和呼叫方法。4 掌握子程式 子程式的巢狀 遞迴子程式的結構。5 掌握子程式設計 編制及除錯。6 熟練掌握debug的常用命令,學會用debug除錯程式。2 實驗內容 1 編制在螢幕上顯示九九乘法表的程式。2 編制...
組合語言程式設計實驗報告冊
資訊學院 學號姓名 班級實驗教師 實驗一 利用debug命令除錯小匯程式設計序 一.實驗目的 二.實驗工具軟體 三.實驗過程 除錯結果及結論 實驗二 資料傳送類指令。一.實驗目的 二.實驗工具軟體 三.實驗過程 除錯結果及結論 實驗三 查表及定址方式 一.實驗目的 二.實驗工具軟體 三.實驗過程 除...