彙編實驗十(王爽)

来源:https://www.cnblogs.com/jane315/archive/2020/05/23/12940541.html
-Advertisement-
Play Games

設計子程式 子程式一:在指定的位置,用指定的顏色,顯示一個用0結束的字元串 舉例:在屏幕的8行3列,用綠色顯示data段中的字元串 assume cs:code data segment db 'Welcome to masm!',0 data ends code segment start: mo ...


設計子程式

子程式一:在指定的位置,用指定的顏色,顯示一個用0結束的字元串

舉例:在屏幕的8行3列,用綠色顯示data段中的字元串

assume cs:code

data segment
    db 'Welcome to masm!',0
data ends

code segment
start:   mov dh,8     ;行
         mov dl,3     ;列
         mov cl,2     ;顏色屬性
         mov ax,data
         mov ds,ax
         mov si,0
         call show_str  ;子程式

         mov ax,4c00h
         int 21h

show_str:
         push dx   ;避免寄存器衝突(雖然這個子程式沒有衝突,但為了更好的使用,還是加上了)
         push cx
         push si  
        
         mov ax,0b800h  
         mov es,ax   ;顯示緩衝區段地址
         mov al,dh
         mov bl,0a0h  ;用於計算第八行的首地址
         dec al      
         mul bl    ;首地址在ax中
         mov bx,ax  ;存在bx寄存器內
         mov dh,0
         mov di,dx  ;用於計算列地址
         dec di
         add di,di ;列地址就在di寄存器中
         mov al,cl
      s: mov cl,ds:[si] ;取出字元,要判斷cx是否為0
         mov ch,0
         jcxz ok  ;終止指令跳轉的條件
         mov dl,ds:[si]   ;取出字元
         mov es:[bx+di],dl   ;將字元送入顯示緩衝區中
         mov es:[bx+di+1],al  ;設置字元屬性
         inc si     ;data段的地址偏移+1
         add di,2   ;顯是緩衝區段地址+2
         jmp short s ;指令跳轉

     ok: 
         pop dx  ;恢復主程式中寄存器的值
         pop cx
         pop si
         ret   ;子程式返回
code ends

end start

 

運行結果:(不知明原因,第一行會被吃掉,因此實際顯示是在第七行)

 

 

子程式二:

功能:解決除法溢出問題

應用舉例:計算1000000/10(F4240/0AH)

返回: (dx) = 結果的高16位,(ax)=結果的低16位,(cx)=餘數

結果:(dx) =0001H, (ax)=86A0H,(cx)=0 

公式:

H:X的高16位

L:X的低16位

N:除數

X/N = int(H/N)*65535 + [rem(H/N*65535)+L]/N

(對公式的理解很重要!!!我看了半天,才看懂了)

 

assume cs:code


code segment
start:  mov ax,4240h  ;存放被除數(dword類)的低16位地址
        mov dx,000fh   ;存放被除數(dword類)的高16位地址
        mov cx,0ah     ;存放除數
        call divdw

divdw: 
        push ax   ;把ax(即低16位地址先存入棧中,之後要用到)

        mov ax,dx  ;對高16位地址進行16位除法
        mov dx,0
        div cx
        mov bx,ax ;bx的值為int(H/N),將除法所得商移入bx中
        pop ax    ;取出低16位地址
    
div cx ;對低16位地址進行16位除法,結果的低16位商位於ax寄存器中 mov cx,dx ;將餘數移入cx中 mov dx,bx ;將結果的高16位商移入dx中 ret code ends end start

 

 運行結果:

 

 子程式設計三:

功能:將word型數據轉變為表示十進位數據的字元串,字元串以0結尾

應用舉例:將12666以十進位的形式在屏幕的8行3列,用綠色顯示出來(顯示時調用子程式一)

assume cs:code

data segment
    db 10 dup(0) ;保存字元串的記憶體地址段
data ends


code segment
start:      mov ax,12666
            mov bx,data
            mov ds,bx
            mov si,0
            call dtoc  ;調用子程式

            mov ax,4c00h
            int 21h

dtoc:       mov bx,10   ;bx為除數
            mov dx,0    
            div bx    ;對ax進行16位除法
            mov cx,ax  ;商保存在cx中,用於結束除法的繼續,當商為0時,代表所有餘數已求出
            add dx,30h ;利用十進位對應的ascii碼=十進位數值碼+30H,得出字元並存在寄存器dx中
            push dx   ;將字元結果保存在棧中,因為餘數結果相對於本身字元的順序是逆序,因此我們要利用棧來逆序
            add si,1  ;記錄除的次數,也就是字元的個數
            jcxz s1  ;若cx即商為0,則調到s1處
            jmp short dtoc  ;迴圈除法

            
s1:         mov bl,0
            mov ds:[si],bl  ;在data段的即將放入字元的末尾,將0存入
            mov cx,si  ;將字元的個數存取cx中
            mov si,0   ;si寄存器表示data段的偏移地址
s2:         pop ds:[si] ;取出放在棧中的數據
            add si,1   ;偏移地址+1
            loop s2  ;迴圈

            mov dh,8  ;顯示字元串
            mov dl,3
            mov cl,2
            mov si,0
            call show_str
            ret

show_str:    push dx
             push cx
             push si  
            
             mov ax,0b800h
             mov es,ax
             mov al,dh
             mov bl,0a0h
             dec al
             mul bl
             mov bx,ax
             mov dh,0
             mov di,dx
             dec di
             add di,di
             mov al,cl
          s: mov cl,ds:[si]
             mov ch,0
             jcxz ok
             mov dl,ds:[si]
             mov es:[bx+di],dl
             mov es:[bx+di+1],al
             inc si
             add di,2
             jmp short s

         ok: 
             pop dx
             pop cx
             pop si

             ret
code ends

end start

運行結果:(還是一樣,第一行顯示的會被吃掉,所以實際在第七行)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前提: SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(一):搭建基本環境:https://www.cnblogs.com/l-y-h/p/12930895.html 一、定義公共組件頁面 簡單的頁面效果如下所示:(做的比較粗糙,大致理解頁面即可) 1、 ...
  • 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 原文出處:https://blog.bitsrc.io/what-is-deno-and-will-it-replace-nodejs-a13aa1734a74 Deno是什麼? Deno v1.0.0已於5 ...
  • 一、JML初探 ​ 作為一種形式化語言,可以約束 代碼中類和方法的狀態和行為形成規格,通過將一系列具體代碼實現抽象成明確的行為介面,可以形成一種契約式編程模式, 設計者無需考慮實際的數據結構與演算法,可以聚焦於程式的整體邏輯, 形式化語言的無二義性能讓實現者準確理解介面功能,根據問題需要選擇合適的實現 ...
  • 首先安裝Erlang環境 因為 RabbitMQ 需要 erlang 環境的⽀持,所以必須先安裝 erlang 。 如果只是使用RabbitMQ,個人推薦使用RabbitMQ公司維護的 "erlang" 版本,該版本只保留了與RabbltMQ相關的功能, centOS6與7版本的都有,還有erlan ...
  • 【導讀】:前面的文章介紹了移動平均濾波器、IIR濾波器、梳狀濾波器,今天來談談FIR濾波器的設計實現。 本篇文章依然採用4W1H進行描述,從 What Why Where When How 幾個維度展開。為了便於理解4W1H,依然把5W1H的圖附上。 FIR濾波器之What? LTI線性時不變系統沖 ...
  • [導讀]:前面一篇文章關於IIR/移動平均濾波器設計的文章。本文來聊一聊陷波濾波器,該濾波器在混入諧波干擾時非常有用,演算法簡單,實現代價低。本文來一探其在機理、應用場景。 註:儘量在每篇文章寫寫摘要,方便閱讀。信息時代,大家時間都很寶貴,如此亦可節約粉絲們的寶貴時間。 前文所說學習的倡導2W1H原則 ...
  • 本文是學習筆記中的思維導圖,感覺思維導圖是個好東西,可以加深記憶、構建知識體系、還能為將來的複習提供便利。 完整筆記的地址在文末。說明下,併發編程的底層原理和JMM我打算背下來。 完整筆記地址: "java併發編程藝術學習筆記gitbook" "java併發編程藝術學習筆記github" 下麵這個是 ...
  • 一、反射的概念 1.反射的概念是有Smith在1982年首次提出,主要是指程式可以訪問、檢測和修改它本身狀態或者行為的一種能力,並且根據自身行為的狀態和結果,調整或者修改應用所描述行為的狀態和相關的語義。 2.Java中,反射是一種強大的工具,它使您能夠創建靈活的代碼,這些代碼可以在運行時進行裝配, ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...