日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言程序设计

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言程序设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

匯編語言程序設計

    • 匯編語言源程序
      • 匯編語言源程序的結構
      • 表達式
      • 偽指令
        • 格式
        • 操作數
        • 重復操作符
        • 段定義偽指令
        • 設定段寄存器偽指令

匯編語言源程序

匯編語言源程序的結構

一個完整的源程序通常由若干邏輯段組成,包括數據段、附加段、堆棧段和代碼段。它們分別映射到存儲器中的物理段上。每個邏輯段以segment語句開始,以ends結束,整個源程序用end語句結尾。

代碼段中存放源程序的所有指令碼、數據、變量等則放在數據段和附加段中。程序中可以定義堆棧段,也可以直接利用系統中的堆棧段。具體一個源程序中要定義多少個段應根據實際需求來定。

dseg segment ;定義數據段data1 dw 0f865h ;DW是定義2字節空間data2 dw 360ch dseg endseseg segment ;定義附加段sum dw 2 dup(?) ;定義存放結果 eseg endscseg segment ;定義代碼段assume cs:cseg,ds:dseg,es:eseg start:mov ax,dsegmov ds,ax ;初始化DSmov ax,esegmov es,ax ;初始化ESlea si,sum ;存放結果的偏移地址送SImov ax,data1 ;取被加數add ax,data2 ;兩數相加mov es:[si],ax ;和送附加段的sumhlt cseg endsend start

表達式

表達式不是一個指令,本身不能執行,在程序匯編時,匯編程序將表達式進行相應的運算,得出一個確定的值。

  • +-*/:當運符作為一個數值表達式時,其匯編結果就是一個數值。

  • 邏輯運算符:只用于數值表達式,用于對數值進行位運算并得到一個結果。

  • 關系運算符:有六個,EQ(相等),NE(不相等),LT(小于),GT(大于),LE(小于等于),GE(大于等于)。

  • 取值運算符和屬性運算符

  • OFFSET:可以得到一個標號或變量的偏移地址。例如:mov si,offset data1將變量data1的偏移地址送si。與lea si,data1執行結果相同。
  • SEG:利用運算符可以得到一個標號或變量的段地址。例如:mov ax,seg data
  • PTR:屬性運算符用來指定定位于其后的存儲器操作數的類型。call dword ptr[bx]說明存儲器操作數為4個字節,即調用遠程。
  • 偽指令

    格式

    [變量] 偽操作 操作數,[操作數...],常用數據定義偽指令有以下5種。

  • DB:定義變量為字節類型,變量中的每個操作數占一個字節,DB偽指令也常用來定義字符串。
  • DW:定義變量為字類型,DW偽指令后面的操作數都占2個字節,在內存中存放時,低字節放到低地址。
  • DD:定義變量為雙字節類型,DD偽指令后面的每個操作數都占用4個字節,在內存中存放時,同樣是低字節發放到低地址。
  • DQ:定義變量為四字類型,在內存中存放。
  • DT:定義變量為十字節類型,在內存中存放。
  • 操作數

    data db 11h,33h ;定義包含兩個元素的字節變量data num dw 100*5+88 ;定義一個字類型,其初值為表達式的值 str db 'hello!' ;定義一個字符串,首地址為str sum dq 0011223344556677h ;將4個字存入sum,它們在內存中的存放由低到高為77h,66h,55h,44h data2 dw ? ;為變量data2分配2個字節的空間,初值為任意值

    重復操作符

    [變量名] 數據定義偽操作 n dup(初值,[初值...]),圓括號中為重復的內容,n為重復的次數,如果用n dup(?)作為數據定義偽操作的唯一操作數,則匯編程序僅保留n個元素大小的數據區。

    data1 db 20 dup(?) ;為變量data1分配20個字節的空間,初值為任意值。 data2 db 20 dup(30h) ;為變量data2分配20個字節的空間,初值均為30h

    段定義偽指令

    段名 segment [定位類型][組合類型]['類別'] ... 段名 ends

    定位類型

  • para:說明邏輯段從一個字節的邊界開始,16個字節為一個節,所以段的起始地址應能被16整除,也就是起始的物理地址為xxxx0h。
  • byte:說明邏輯段從字節邊界開始,即可以從任何地址開始,此時本段的起始地址緊接在前一個段的后面。
  • word:說明邏輯段從字邊界開始,即本段的起始地址必須是偶數。
  • page:說明邏輯段從頁邊界開始,256字節為一頁,故本段起始物理地址為xxx00h。
  • 組合類型

  • none:表示本段與其他邏輯段不組合。即對不同程序模塊中的邏輯段,即使具有相同的段名,也分別作為不同的邏輯段裝入內存而不進行組合。
  • public:表示對于不同程序模塊中用public說明的具有相同段名的邏輯段,匯編將它們組合到一起,構成一個大的邏輯段。
  • stack:組合類型為stack時,其含義和public基本相同,但僅限于堆棧段使用。
  • common:表示不同程序模塊中用common說明的同名邏輯段,連接時從同一個地址開始裝入,即各個邏輯段重疊一起。連接之后的段長度等于原來最長的邏輯段長度。
  • memory:表示當幾個邏輯段連接時,本邏輯段定位在地址最高的地方。如果被連接的邏輯段中有多個段的組合類型都是memory,則匯編程序只將首先遇到的段作為memory,而其余的都作為common處理。
  • 設定段寄存器偽指令

    assume偽指令用于向匯編程序說明所定義的邏輯段屬于何種類型的邏輯段。說明方法是將邏輯段的短命和對應的段寄存器聯系起來。一般格式為assume 段寄存器名:段名,[段寄存器:段名]。

    ; 程序功能:10ms延時的子程序 delay proc ;定義一個子過程 proc的作用是子程序定義偽指令push bx ;保護原有bx內容push cx ;保存原有cx內容mov bl,2 ;外循環次數 next: mov cx,4167 ;內循環次數(延時5ms) w10ms:loop w10ms ;cx不等于0時則循環dec bl ;修改外循環計數值jnz next ;BX不為0時則進行第二輪循環pop cx ;恢復cx值。pop bx ;恢復bx值。ret ;過程返回 delay endp

    總結

    以上是生活随笔為你收集整理的汇编语言程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。