組合語言程式設計實驗報告

2021-03-04 09:39:16 字數 4484 閱讀 6314

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命令除錯小匯程式設計序 一.實驗目的 二.實驗工具軟體 三.實驗過程 除錯結果及結論 實驗二 資料傳送類指令。一.實驗目的 二.實驗工具軟體 三.實驗過程 除錯結果及結論 實驗三 查表及定址方式 一.實驗目的 二.實驗工具軟體 三.實驗過程 除...