匯編個位數求和實驗


title: 匯編求和實驗
keywords: 匯編
tags: [匯編]
categories: 嵌入式


匯編求和實驗

剛開始學習匯編 給大家做個參考

實驗 5 子程序 5.1 實驗目的 ①掌握利用堆棧傳遞參數的子程序調用方法。 ②過程調用偽指令:PROC,ENDP,NEAR和FAR。 ③8088指令:CALL,RET,RETn。 5.2 實驗類型 驗證型實驗\2. 操作步驟 ①輸入,編譯并運行程序。 ②用emu8086運行此程序,觀察并記錄每次過程調用及進出棧指令前后的SP和堆棧內容。 ③記錄最后結果:SUM1,SUM2的段及偏移地址和它們的內容。 ④修改并自編程序,使得在屏幕上可以輸入任意6個十進制數字,同時在屏幕上輸出SUM1 的結果(要求輸出十進制數字,打印出有效2位數即可)。

  1. AX:這是一個通用寄存器,通常用于算術和邏輯操作。在這段程序中,它被用來存儲 DATAS 段的地址,然后這個地址被移動到 DS 寄存器。

  2. DS:這是一個段寄存器,用于存儲數據段的地址。在這段程序中,它被設置為 DATAS 段的地址,這樣程序就可以訪問在 DATAS 段中定義的數據了。

  3. SI:這是一個索引寄存器,通常用于存儲數組或字符串的索引。在這段程序中,它被用來存儲 DATA 數組的當前索引。

  4. CX:這是一個計數寄存器,通常用于存儲循環的次數。在這段程序中,它被設置為6,表示輸入循環的次數。

  5. DX:這是一個通用寄存器,通常用于I/O操作。在這段程序中,它被用來存儲字符串的地址,然后這個地址被用于 INT 21H 中斷,以打印字符串。

  6. AH:這是 AX 寄存器的高8位,通常用于存儲操作碼。在這段程序中,它被設置為9,表示打印字符串的操作。

  7. DI:這是一個索引寄存器,通常用于存儲數組或字符串的索引。在這段程序中,它被初始化為0,用于打印總和。

    修改并自編程序,使得在屏幕上可以輸入任意6個十進制數字,同時在屏幕上輸出SUM1 的結果(要求輸出十進制數字,打印出有效2位數即可)。

DATAS SEGMENTstring_1 DB 'input','$' ; 提示輸入string_2 DB 'input again','$' ; 無效輸入的錯誤消息string_3 DB ' ','$' ; 空格字符DATA  DW 10 DUP(?) ; 存儲輸入數字的數組message  DB 0ah,'sum:',0DH,'$' ; 總和輸出的消息
DATAS ENDSSTACKS SEGMENTDW 256 dup(?) 
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX ; 設置DS寄存器指向DATAS段MOV SI, 0  ; 指針初始化MOV CX, 6 ; 循環次數MOV DX, OFFSET string_1 ; 提示輸入MOV AH, 9INT 21HLp:CALL Input ; 調用輸入子程序ADD SI, 2 ; 指針增加2(每個輸入數字占2個字節)Loop Lp ; 循環直到所有數字輸入完畢MOV DX, OFFSET message ; 打印總和消息MOV AH, 9INT 21HCALL Get_sum ; 調用Get_sum子程序計算總和MOV DX, AXADD DX, 30HMOV AH, 2INT 21HMOV AH, 4CH INT 21HInput PROC Nearpush AX push BXpush CX push DX MOV BX, 0 CLC ; 清除進位標志MOV DX, 0 Lp_0:MOV AH, 1INT 21H ; 從輸入中讀取一個字符CMP AL, 20H ; 檢查輸入是否為空格字符JE L_CRLF ; 如果是空格,跳轉到L_CRLFSUB AL, 30H ; 將ASCII轉換為整數MOV AH, 0 ; 清除AH寄存器XCHG AX, BX ; 交換AX和BX寄存器JMP Lp_0 ; 繼續輸入循環L_CRLF: ; 輸入結束標記(換行)MOV DX, 0MOV DATA[SI], BX ; 將輸入數字存儲在DATA數組中POP DXPOP CXPOP BXPOP AXRET
Input ENDPGet_sum PROC NEARPUSH BXPUSH CXMOV BX, 0MOV CX , 6MOV DI, 0LOP1:MOV AX, DATA[DI]ADD BX, AXADD DI , 2LOOP LOP1MOV AX, BXPOP BXPOP CXRET
Get_sum ENDPCODES ENDS
END START

Input過程是一個子程序,用于讀取用戶的輸入。它首先將AX、BX、CX和DX寄存器的值壓入堆棧以保存它們的當前狀態。然后,它使用DOS中斷21H的功能1來讀取用戶的輸入。如果輸入是空格(ASCII值為20H),則結束輸入;否則,將輸入的ASCII值轉換為數字,并存儲在BX寄存器中。最后,將BX寄存器的值存儲在DATA數組中,并恢復AX、BX、CX和DX寄存器的值。

Get_sum過程是另一個子程序,用于計算DATA數組中的所有數字的和。它首先將BX和CX寄存器的值壓入堆棧以保存它們的當前狀態。然后,它初始化BX寄存器為0,用于存儲和;初始化CX寄存器為6,表示要加的數字的數量;初始化DI寄存器為0,表示數組的索引。然后,它在循環中將DATA數組中的每個數字加到BX寄存器中。最后,將和存儲在AX寄存器中,并恢復BX和CX寄存器的值。

但這個有致命缺點

笑死了 直接加0x30得到十進制數字就是 只有0-9可以正常輸出結果

首先,它將12賦值給AX寄存器,然后將10賦值給CL寄存器。然后,它使用div cl指令將AX寄存器的值除以CL寄存器的值。在這個操作后,商(也就是十位數)存儲在AL寄存器中,余數(也就是個位數)存儲在AH寄存器中。然后,它將AH寄存器的值復制到BH寄存器中。

然后,它檢查AL寄存器的值是否為0。如果AL寄存器的值為0,那么它將跳轉到tito標簽,否則,它將繼續執行。

接下來,它將AL寄存器的值復制到DL寄存器中,然后將DL寄存器的值增加30H(因為在ASCII編碼中,數字字符的編碼是從30H開始的)。然后,它將AH寄存器的值設置為2,然后調用DOS中斷21H的功能2,將DL寄存器中的字符輸出。

tito標簽處,它將BH寄存器的值復制到DH寄存器中,然后將DH寄存器的值增加30H。然后,它將AH寄存器的值設置為2,然后調用DOS中斷21H的功能2,將DH寄存器中的字符輸出。

DATAS SEGMENTstring_1 DB 'input','$' ; 提示輸入string_2 DB 'input again','$' ; 無效輸入的錯誤消息string_3 DB ' ','$' ; 空格字符DATA  DW 6 DUP(?) ; 存儲輸入數字的數組message  DB 'sum:',0ah,'$' ; 總和輸出的消息
DATAS ENDSSTACKS SEGMENTDW 256 dup(?) 
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX ; 設置DS寄存器指向DATAS段MOV SI, 0  ; 指針初始化MOV CX, 6 ; 循環次數MOV DX, OFFSET string_1 ; 提示輸入MOV AH, 9INT 21HLp:CALL Input ; 調用輸入子程序ADD SI, 2 ; 指針增加2(每個輸入數字占2個字節)Loop Lp ; 循環直到所有數字輸入完畢MOV DX, OFFSET message ; 打印總和消息MOV AH, 9INT 21HCALL Get_sum ; 調用Get_sum子程序計算總和存到axmov cl, 10div cl     mov bh,ah cmp al, 0je tito          ;十位為零 跳轉titoMOV Dl, al  ADD dl, 30HMOV AH, 2INT 21H        tito:MOV Dl, bh  ADD dl, 30HMOV AH, 2INT 21H Input PROC Nearpush AX push BXpush CX push DX MOV BX, 0 CLC ; 清除進位標志MOV DX, 0 Lp_0:MOV AH, 1INT 21H ; 從輸入中讀取一個字符CMP AL, 20H ; 檢查輸入是否為空格字符JE L_CRLF ; 如果是空格,跳轉到L_CRLFSUB AL, 30H ; 將ASCII轉換為整數MOV AH, 0 ; 清除AH寄存器XCHG AX, BX ; 交換AX和BX寄存器JMP Lp_0 ; 繼續輸入循環L_CRLF: ; 輸入結束標記(換行)MOV DX, 0MOV DATA[SI], BX ; 將輸入數字存儲在DATA數組中POP DXPOP CXPOP BXPOP AXRET
Input ENDPGet_sum PROC NEARPUSH BXPUSH CXMOV BX, 0MOV CX , 6MOV DI, 0LOP1:MOV AX, DATA[DI]ADD BX, AXADD DI , 2LOOP LOP1MOV AX, BXPOP BXPOP CXRET
Get_sum ENDPCODES ENDS
END START

如此我們便完成這節課的任務了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10495.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神經網絡權重初始化學習

在神經網絡中,權重初始化是一個關鍵步驟,它影響著模型的訓練效率和最終性能。使用正態分布作為初始值是一種常見且有效的策略,尤其是在深度學習中。 原理 為何使用分布初始化? 如果所有權重初始化為相同的值(如全零初…

hive日常使用時忘記部分補充(不定時)

1、date_formate、unix_timestamp、from_unixtime用法: 2、lag()、lead()用法: lag()窗口函數返回分區中當前行之前行(可以指定第幾行)的值。 如果沒有行,則返回null。 lead()窗口…

pytest + yaml 框架 - 錄制接口轉 yaml 用例實現

pytest yaml 框架基本不用寫 python 代碼,只需寫yaml 文件用例就能實現接口自動化。 現在引入接口錄制功能,連 yaml 文件也不用寫了,點點點就能生成 yaml 用例文件了。 錄制功能在v1.3.4版本上實現 pip instal pytest-yaml-yoyo 環境準備 …

如何使用 ArcGIS Pro 制作地震動畫

在做某些匯報的時候,除了圖文,如果有動畫肯定會成為加分項,這里為大家介紹一下如何使用 ArcGIS Pro 制作地震動畫,希望能對你有所幫助。 添加時間 在圖層屬性內,選擇時間選項卡,圖層時間選擇每個要素具有…

鎵未來助力聯想筆記本GaN適配器標配化,賦能高效用戶體驗

鎵未來賦能筆記本電腦GaN適配器標配化 據悉,Lenovo 2024年推出搭配的多款新型筆記本原裝適配器電源ADL100UDGC3A,采用了鎵未來集成型Cascode技術氮化鎵功率器件G1N65R150PB。新款方案相較上一代工藝,體積減小23%,重量降低18%&…

秋招算法刷題10(棧和隊列)

0509 232.用棧實現隊列 class MyQueue {Deque<Integer> inStack;Deque<Integer> outStack;public MyQueue() {inStack new ArrayDeque<Integer>();outStack new ArrayDeque<Integer>();}public void push(int x) {inStack.push(x);}public int pop…

13.跳躍游戲

文章目錄 題目簡介題目解答解法一&#xff1a;貪心算法&#xff0b;動態規劃代碼&#xff1a;復雜度分析&#xff1a; 題目鏈接 大家好&#xff0c;我是曉星航。今天為大家帶來的是 跳躍游戲面試題 相關的講解&#xff01;&#x1f600; 題目簡介 題目解答 思路&#xff1a;這…

Vue3知識總結-2

目錄 通過key來管理狀態 事件處理 內聯事件處理器 方法事件處理器 事件傳參 獲取event 傳遞參數 傳參的過程中獲取事件對象 事件修飾符 阻止事件描述符 阻止事件冒泡 數組變化偵測 變更方式 替換一個數組 計算屬性 Class綁定 綁定對象 綁定數組 Style綁定 …

【Python 常用腳本及命令系列 3.3 -- Python 統計程序執行時間】

請閱讀【嵌入式開發學習必備專欄】 文章目錄 Python 統計程序執行時間 Python 統計程序執行時間 在Python中&#xff0c;可以使用time模塊來測量執行一個函數所需的時間。以下是一個基本的例子&#xff0c;展示了如何實現這一功能&#xff1a; import time def your_function…

element-plus 工作經驗總結

Element-plus 文章目錄 Element-plus忠告: 最好鎖定版本, 免得更新更出 BUG 來了el-drawer 設置 modal"false" 后, 遮罩元素仍存在, 點不了空白的地方el-tree 大數據量時接收 check-change 事件報錯導致涉及多個節點的操作沒執行完畢el-table 表頭 show-overflow-too…

前端小程序調用 getLocation 實現地圖位置功能,通過 緯度:latitude 經度: longitude 獲取當前位置

1、首先登錄一下 騰訊的位置服務 有賬號就登錄沒賬號就注冊&#xff0c; 點擊右上角的控制臺點擊左側的應用管理 ---> 我的應用 ---->> 創建應用 1、創建應用 2、列表就會顯示我們剛剛創建好的 key 3、點擊添加 key 4、按照要求填寫信息 我們用的是小程序 所以選擇…

二叉樹介紹

引入 定義 區別 定義不同 形態不同 基本形態

AD域服務器巡檢指南

Active Directory (AD) 域服務器的巡檢對于確保企業網絡的安全性和高效運行至關重要。以下是針對AD域服務器巡檢的關鍵活動和其重要性的優化描述&#xff1a; 保證系統安全&#xff1a; AD域服務器儲存大量敏感數據&#xff0c;包括用戶賬戶信息、策略和訪問權限數據。定期巡檢…

windows和 Linux 下通過 QProcess 打開ssh 和vnc

文章目錄 SSHSSH驗證啟動SSH一、口令登錄二、公鑰登錄通過Qprocess 啟動ssh VNC Viewer簡介通過QProcess啟動vncViewer SSH Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在應用層基礎上的**安全網絡協議**。它是專為遠程登錄會話(**甚至可以…

uniapp下拉選擇組件

uniapp下拉選擇組件 背景實現思路代碼實現配置項使用尾巴 背景 最近遇到一個這樣的需求&#xff0c;在輸入框中輸入關鍵字&#xff0c;通過接口查詢到結果之后&#xff0c;以下拉框列表形式展現供用戶選擇。查詢了下uni-app官網和項目中使用的uv-ui庫&#xff0c;沒找到符合條…

微信小程序中的圖像奧秘:圖片與Base64的華麗變身記

微信小程序中的圖像奧秘&#xff1a;圖片與Base64的華麗變身記 基本概念解析圖片與Base64的關系為何轉換 圖片轉Base64實戰微信小程序使用wx.getImageInfo獲取圖片信息圖片轉換為Base64注意 Base64轉圖片直接在小程序頁面顯示云開發環境轉換注意 遇遇問題排查思路結語引發討論 …

前端開發工程師——ajax

express框架 終端輸入 npm init --yes npm i express 請求報文/響應報文 // 1.引入express const express require(express);// 2.創建應用對象 const app express();// 3.創建路由規則 // request:是對請求報文的封裝 // response&#xff1a;是對響應報文的封裝 app.get(…

【御控物聯】Java JSON結構轉換、JSON協議轉換、JSON屬性互換(15):對象To數組——轉換映射方式

文章目錄 一、JSON結構轉換是什么&#xff1f;二、術語解釋三、案例之《JSON對象 To JSON數組》四、代碼實現五、在線轉換工具六、技術資料 一、JSON結構轉換是什么&#xff1f; JSON結構轉換指的是將一個JSON對象或JSON數組按照一定規則進行重組、篩選、映射或轉換&#xff0…

Vue3自定義封裝音頻播放組件(帶拖拽進度條)

Vue3自定義封裝音頻播放組件&#xff08;帶拖拽進度條&#xff09; 描述 該款自定義組件可作為音頻、視頻播放的進度條&#xff0c;用于控制音頻、視頻的播放進度、暫停開始、拖拽進度條拓展性極高。 實現效果 具體效果可以根據自定義內容進行位置調整 項目需求 有播放暫停…

XSS實戰漏洞挖掘

接下來一年時間將會主要研究滲透測試方向的眾多問題&#xff0c;文章中的內容也會在后面定期更新。本文主要記錄了一些XSS漏洞挖掘中的實用心得和學習筆記。 漏洞描述 漏洞描述&#xff1a;跨站腳本攻擊的英文全稱是Cross Site Script&#xff0c;為了和樣式表區分&#xff0…