匯編:字符串的輸出

在16位匯編程序中,可以使用DOS中斷21h的功能號09h來打印字符串;下面是一個簡單的示例程序,演示了如何在16位匯編程序中打印字符串:

assume cs:code,ds:data
?
data segmentszBuffer db 0dh,0ah,'HelloWorld$'  //定義字符串
data ends
?
code segment
start:mov ax,data  ; 將數據段地址加載到AX寄存器中mov ds,ax    ; 將AX中的數據段地址加載到DS寄存器中(`DS` 寄存器是一個段寄存器,用于存儲數據段的地址。)mov dx,offset szBuffer  ; 將szBuffer的偏移地址加載到DX寄存器中 mov ah,09h ?  ; DOS功能號09h,用于顯示字符串int 21h       ; 調用DOS中斷21h
?mov ax,4c00h ?int 21hcode ends
end start

assume cs:code, ds:data:指令告訴匯編器代碼段位于 cs 寄存器所指示的代碼段中,數據段位于 ds 寄存器所指示的數據段中。

data segmentdata ends 之間的部分是數據段。在這里,szBuffer 被定義為一個字符串,以 $ 結尾。

0dh0ah 是 ASCII 字符集中的轉義序列,分別代表回車(Carriage Return)和換行(Line Feed)。

  • 0dh 對應于回車字符,表示將光標移動到當前行的開頭,但不換行。通常與 0ah 結合使用,表示回車換行,即在顯示文本時,光標移到下一行的開頭。

  • 0ah 對應于換行字符,表示將光標移動到下一行的開頭。

code segmentcode ends 之間的部分是代碼段。在 start 標簽處開始執行。

mov ax, data:將數據段地址加載到 AX 寄存器中。

mov ds, ax:將 AX 中的數據段地址加載到 DS 寄存器中,這樣程序就可以訪問數據段中的數據。

mov dx, offset szBuffer:將 szBuffer 的偏移地址加載到 DX 寄存器中;offset 操作符用于獲取標簽(如變量或標簽)的偏移地址。

mov ah, 09h:將 09h 存儲在 AH 寄存器中,該值表示調用 DOS 中斷 21h 的功能號 09h,用于顯示字符串。

int 21h:調用 DOS 中斷 21h,顯示字符串。

使用ML.exe對匯編程序進行處理后,執行處理后生成的exe程序,得到結果:

上述代碼中我們使用OFFSET操作符將szBuffer字符串變量的地址偏移值計算出來,接著使用mov指令將偏移值移入dx寄存器中,接著使用DOS中斷21h的功能號09h來打印字符串,即將功能號09h傳入ax寄存器的高地址寄存器ah中,最后使用int 21h調用中斷執行打印字符串的操作。

但其實在計算字符串的地址時除了使用OFFSET操作符之外,我們還可以使用lea指令取獲取字符串的有效地址。

LEA指令

LEA指令(Load Effective Address)是x86匯編語言中的一條指令,用于將一個有效地址加載到寄存器中。它的主要用途是計算地址,但不進行內存訪問。

語法
LEA destination, source
  • destination 是一個寄存器,用于存儲計算出的地址。

  • source 是一個內存操作數,表示需要計算的有效地址。

此時我們使用lea指令獲取字符串的有效地址,并調用中斷將其打印

assume cs:code,ds:data
?
data segmentszBuffer db 0dh,0ah,'HelloWorld$'
data ends
?
code segment
start:mov ax,datamov ds,ax//打印字符串mov ah,09hlea dx,szbufferint 21hint 21h ;再次調用中斷打印字符串mov ax,4c00hint 21hcode ends
end start
  • lea dx, szBuffer:將 szBuffer 的偏移地址加載到 DX 寄存器。

  • int 21h:調用DOS中斷21h,打印以 $ 結束的字符串。

  • int 21h:再次調用中斷,重復打印字符串。

最后運行該程序生成的exe文件:

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

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

相關文章

【C++】哈夫曼編碼:高效的壓縮算法

哈夫曼編碼:高效的壓縮算法 什么是哈夫曼編碼? 哈夫曼編碼是一種用于數據壓縮的無損編碼方法,由David A. Huffman于1952年提出。它利用了字符出現頻率的不均勻性,通過構建最優前綴碼,能夠有效減少數據的冗余&#xf…

Flutter仿照微信實現九宮格頭像

一、效果圖 2、主要代碼 import dart:io; import dart:math;import package:cached_network_image/cached_network_image.dart; import package:flutter/material.dart;class ImageGrid extends StatelessWidget {final List<String> imageUrls; // 假設這是你的圖片URL…

關于Iterator 和ListIterator的詳解

1.Iterator Iterator的定義如下&#xff1a; public interface Iterator<E> {} Iterator是一個接口&#xff0c;它是集合的迭代器。集合可以通過Iterator去遍歷集合中的元素。Iterator提供的API接口如下&#xff1a; forEachRemaining(Consumer<? super E> act…

VS2022通過C++網絡庫Boost.Asio創建一個簡單的同步TCP服務器和客戶端

Boost.Asio是一個用于網絡和異步編程的C庫。它提供了一種跨平臺的方式來處理網絡編程和異步操作&#xff0c;使開發人員能夠創建高性能的網絡應用程序&#xff0c;asio幾乎支持所有你能夠想到的網絡協議&#xff0c;比如tcp、udp、ip、http、icmp等&#xff0c;C通過asio庫可以…

找出第 K 大的異或坐標值

問題 給你一個二維矩陣 matrix 和一個整數 k &#xff0c;矩陣大小為 m x n 由非負整數組成。 矩陣中坐標 (a, b) 的 值 可由對所有滿足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下標從 0 開始計數&#xff09;執行異或運算得到。…

淺談網絡通信(1)

文章目錄 一、認識一些網絡基礎概念1.1、ip地址1.2、端口號1.3、協議1.4、協議分層1.5、協議分層的2種方式1.5.1、OSI七層模型1.5.2、TCP/IP五層模型[!]1.5.2.1、TCP/IP五層協議各層的含義及功能 二、網絡中數據傳輸的基本流程——封裝、分用2.1、封裝2.2、分用2.2.1、5元組 三…

基于大模型和RAG技術實現的開源項目

基于大模型和RAG技術實現的開源項目 為解決大模型的不足&#xff0c;使用RAG技術增強大模型生成內容的針對性和可讀性能力&#xff0c;有很多不錯的開源項目。例如下面的項目。 1 ragflow 優點&#xff1a;可以對文檔和知識庫進行管理&#xff0c;構建不同的知識庫&#xff…

python冰雹序列的探索與編程實現

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、冰雹序列的奧秘 二、編程實現冰雹序列 三、測試與驗證 四、總結與展望 一、冰雹序列的…

整理好了!2024年最常見 20 道 Redis面試題(八)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常見 20 道 Redis面試題&#xff08;七&#xff09;-CSDN博客 十五、Redis 的性能調優有哪些方法&#xff1f; Redis的性能調優是一個多方面的工作&#xff0c;涉及到硬件、配置、代碼層面的優化等多個方面。以下是一些常…

openEuler 22.03 LTS SP3源碼編譯部署OpenStack-Caracal

openEuler 22.03 LTS SP3源碼編譯部署OpenStack-Caracal 說明機器詳情安裝操作系統注意事項基礎準備Controller節點 && Compute節點 && Block節點關閉防火墻關閉selinux設置靜態IP更新安裝前準備Controller節點 && Compute節點 && Block節點設…

第十課,while循環

一&#xff0c;認識循環是什么 循環普遍存在于日常生活中&#xff0c;同樣&#xff0c;在程序中&#xff0c;循環功能也是至關重要的基礎功能。 當程序需要重復執行某一段代碼&#xff0c;利用循環可以輕松完成工作 例如我要你打印100次上課&#xff0c;直接寫100次print&…

python調用阿里云通義千問(q-wen-max)API-只能總結pdf文檔內容

文章目錄 通義千問插件PDF解析插件調用案例通義千問插件 Dashscope插件功能能夠使得大模型的生成內容與外部三方應用結合,使得模型生成的內容更加準確和豐富,模型將擁有更好的生成能力。您也可以通過開發自定義插件,來使得模型生成更符合您預期的結果。 使用插件功能,大模…

電子閱覽室在管理時需注意什么

關于如今的絕大多數人來說&#xff0c;想必都聽說過“電子閱覽室”這一概念。它首要運用在校園中&#xff0c;給學生們供給愈加豐厚的常識儲藏。它也是一個獨立的局域網&#xff0c;在校園網絡中作為重要的一個組成部分而存在。但是&#xff0c;一個好的電子閱覽室是需求滿意運…

LORA學習筆記3——訓練參數

訓練步長 Step&#xff08;步&#xff09;:模型訓練時ai模型會根據標注生成一個圖片&#xff0c;并與學習圖片進行對比&#xff0c;通過對比的結果調整嵌入向量。這樣的一個流程就被稱為“一步”。 如果一個訓練集中有50張圖片&#xff0c;每張圖片設定為要訓練10次&#xff…

CCF20231201——倉庫規劃

CCF20231201——倉庫規劃 代碼如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,m,a[1001][11],b[1001]{0};cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j)cin>>a[i][j];}for(int i1;i<n;i){bool foundfals…

設計模式在芯片驗證中的應用——模板方法

一、模板方法 模板方法(Template Method)設計模式是一種行為設計模式&#xff0c; 它在父類中定義了一個功能的框架&#xff0c; 允許子類在不修改結構的情況下重寫功能的特定步驟。也就是模板方法定義了一組有序執行的操作&#xff0c;將一些步驟的實現留給子類&#xff0c;同…

把自己的垃圾代碼發布到官方中央倉庫

參考博客&#xff1a;將組件發布到maven中央倉庫-CSDN博客 感謝這位博主。但是他的步驟有漏缺&#xff0c;相對進行補充 訪問管理頁面 網址&#xff1a;Maven Central 新注冊賬號&#xff0c;或者使用github快捷登錄&#xff0c;建議使用github快捷登錄 添加命名空間 注意&…

連接mysql的java代碼

要在Java中連接MySQL數據庫,你需要以下幾個步驟: 導入MySQL JDBC驅動:在項目中添加MySQL JDBC驅動的依賴。如果你使用的是Maven,可以在pom.xml中添加依賴;如果使用的是Gradle,可以在build.gradle中添加依賴;如果不使用構建工具,需要手動下載驅動并添加到項目中。 編寫J…

【Linux】進程通信實戰 —— 進程池項目

送給大家一句話: 沒有一顆星&#xff0c;會因為追求夢想而受傷&#xff0c;當你真心渴望某樣東西時&#xff0c;整個宇宙都會來幫忙。 – 保羅?戈埃羅 《牧羊少年奇幻之旅》 &#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;? &a…

flink cdc mysql整理與總結

文章目錄 一、業務中常見的需要數據同步的場景CDC是什么FlinkCDC是什么CDC原理為什么是FlinkCDC業務場景flink cdc對應flink的版本 二、模擬案例1.阿里云flink sql2.開源flink sql(單機模式)flink 安裝安裝mysql3.flink datastream 三、總結 提示&#xff1a;以下是本篇文章正文…