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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[BX] 和 loop 指令---汇编学习笔记

發布時間:2025/3/15 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BX] 和 loop 指令---汇编学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[BX] 和 loop 指令

  • [bx]和內存單元的描述
  • loop
  • 我們定義的描述性的符號:“()”,“()”中的元素可以有3中類型:寄存器名、段寄存器名、內存單元的物理地址。
  • 約定符號idata表示常量

  • 5.1 [BX]

    具體實例:

    mov ax,[bx]

    功能:bx中存放的數據作為一個偏移地址EA,段地址SA默認在ds中,將SA:EA處的數據送入ax中。即:(ax) = ((ds)*16+(bx))。

    問題 5.1

    程序和內存中的情況如下圖所示,寫出程序執行后,21000H~21007H單元中的內容。

    程序代碼和結果如下:

    mov ax,2000h ;ax = 2000h mov ds,ax ;ds = 2000h mov bx,1000h ;bx = 1000h mov ax,[bx] ;ax = 00BEh inc bx ;bx = 1001h inc是將后面的內容+1 inc bx ;bx = 1002h mov [bx],ax ;2000:1002 = 00BEh inc bx ;bx = 1003h inc bx ;bx = 1004h mov [bx],ax ;2000:1004 = 00BEh inc bx ;bx = 1005h mov [bx],al ;2000:1005 = BEh inc bx ;bx = 1006h mov [bx],al ;2000:1006 = BEh

    5.2 Loop指令

    loop指令格式:loop 標號

    loop指令執行的時候,進行兩步操作:(cx) = (cx) - 1 和 判斷cx中的值,若不為0則轉至標號處執行程序,若為0則向下繼續執行程序(通俗的說,就是如果不為0繼續循環,為0就退出)。

    任務:

  • 編程計算2^2
  • 編程計算2^3
  • 編程計算2^12
  • 對于上面3個問題,如果我們進行重復輸入指令去計算的話,會發現如果我們要計算一百次,就需要寫幾百行代碼。所以我們引入了loop這個工具。

    程序用loop實現:

    assume cs:codecode segmentmov ax,2mov cx,n ;這里的n代表n+1次方s: add ax,ax ;第一次add時,ax = 4 = 2^2loop s mov ax,4c00hint 21hcode endsend

    問題 5.2

    編程,用加法計算 123*236,結果存在ax中。

    assume cs:codecode segmentmov ax,0mov cx,123m: add ax,236loop mmov ax,4c00hint 21hcode endsend

    此時,效率達到最高。


    5.3 在Debug中跟蹤用loop指令實現的循環程序

    考慮這樣一個問題,計算ffff:0006單元中的數乘以3,結果存儲在dx中。

    我們分析一下:

  • 運算后的結果是否會超出dx所能存儲的范圍?
    ffff:0006單元中的數是一個字節型的數據,范圍0~255之間,則用它和3相乘結果不會大于65535,可以在dx中存放下。
  • 用循環累加實現乘法,用哪個寄存器進行累加?
    將ffff:0006單元中的數賦值給ax,用dx進行累加。先設(dx) = 0,然后做3次(dx) = (dx) + (ax)。
  • ffff:6單元是一個字節單元,ax是一個16位寄存器,數據的長度不一樣,如何賦值?
    ax的低8位與ffff:6對其。
  • 編寫程序:

    assume cs:codecode segmentmov ax,0ffffhmov ds,axmov bx,6mov al,[bx]mov ah,0mov dx,0mov cx,3m: add dx,axloop mmov ax,4c00hint 21hcode endsend

    注意:在匯編源程序中,數據不能以字母開頭。

    自行Debug調試。這里還有個g指令,可以直接跳到某個語句。格式為:g IP的地址。


    Debug和匯編編譯器masm對指令的不同處理

    在Debug中編程實現:

    匯編源程序實現:

    assume cs:code code segmentmov ax,2000hmov ds,axmov al,[0]mov bl,[1]mov cl,[2]mov dl,[3]mov ax,4c00hint 21hcode ends end

    在Debug加載后:

    我們發現,Debug將它解釋為[idata],而編譯器將[idata]解釋為idata(也就是說,mov al ,[0] 等效于 (ax) = 0。[idata]表示常量,[bx]表示ds:[bx]。)


    loop 和 [bx] 的聯合應用

    計算ffff:0~b單元中的數據的和,結果存儲在dx中。

    分析:

  • 運算后的結果是否會超出dx所能存儲的范圍?
    ffff:0~b內存單元中的數據是字節型數據,范圍在0~255之間,12個這樣的數據相加,結果不會大于65535,可以在dx中存放下。
  • 我們能否將ffff:0~b中的數據直接累加到dx中?
    當然不行,因為ffff:0~b中的數據是8位的,不能直接加到16位寄存器dx中。
  • 我們能否將ffff:0~b中的數據累加到dl中,并設置(dh)=0,從而實現累加到dx中?
    不行,dl是8位寄存器,只能容納0~255之間,可能會造成進位丟失。
  • 我們到底怎樣將ffff:0~b中的8位數據,累加到16位寄存器dx中?
    將8位數據賦值到一個16位寄存器ax中,再將ax中的數據加到dx上。
  • 程序代碼如下:

    assume cs:code code segmentmov ax,0ffffhmov ds,axmov bx,0mov dx,0mov cx,12s: mov al,[bx]mov ah,0add dx,axinc bxloop smov ax,4c00hint 21hcode ends end

    這就是bx與loop配合使用的一個典型例子。


    5.6 段前綴

    我們可以使用段地址:[偏移地址]的形式:

  • mov ax,ds:[bx]
  • mov ax,cs:[bx]
  • mov ax,ss:[bx]
  • mov ax,es:[bx]
  • mov ax,ss:[0]
  • mov ax,cs:[0]
  • 以上的“ds:”、“cs:”、“ss:”、“es:”,在匯編語言中稱為段前綴


    5.7 一段安全的空間

    我們執行以下程序:

    assume cs:code code segmentmov ax,0mov ds,axmov ds:[26h],axmov ax,4c00hint 21hcode ends end

    運行后,發現報錯:

    這是由于0000:0026處存放的重要系統數據被修改而造成的。

    一般,合法的程序不會使用0000:0200~0000:02ff這段空間,所以對于我們來說,這段空間是安全的


    5.8 段前綴的使用

    將內存ffff:0~b單元中的數據復制到0:200~0:20b單元中。

    分析:

    (1)0:200~0:20b單元等同于0020:0~0020:b單元,它們描述的是同一段內存空間,
    (2)復制的過程應用循環實現。
    (3)在循環中,源始單元ffff:x和目標單元0200:x的偏移地址x是變量。用bx存放。
    (4)將0:200~0:20b用0020:0~0020:b描述。

    程序如下:

    assume cs:code code segmentmov ax,0ffffhmov ds,axmov ax,0020hmov es,axmov bx,0hmov cx,12m: mov dl,[bx]mov es:[bx],dlinc bxloop mmov ax,4c00hint 21hcode ends end

    實驗4 [bx]和loop的使用

    (1)編程,向內存0:200~0:23F依次傳送數據0~63(3FH)。

    assume cs:code code segmentmov ax,20hmov ds,axmov cx,40hmov bx,0s: mov [bx],bxinc bxloop smov ax,4c00hint 21hcode ends end

    (2)編程,向內存0:200~0:23F一次傳送數據0~63(3FH),程序中只能使用9條指令,9條指令中包括“mov ax,4c00h”和“int 21h”。

    答案同上。

    (3)下面的程序的功能是將“mov ax,4c00h”之前的指令復制到內存0:200處,補全程序。上機調試,跟蹤運行結果。

    assume cs:code code segmentmov ax,076Amov ds,axmov ax,0020hmov es,axmov bx,0mov cx,1Bh s: mov al,[bx]mov es:[bx],alinc bxloop smov ax,4c00hint 21hcode ends end

    提示:
    (1)復制的是什么?從哪里到哪里?
    復制的是指令,從076A:0開始到0020:0。
    (2)復制的是什么?有多少個字節?你如何知道要復制的字節的數量?
    有1B個字節。


    本章完

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的[BX] 和 loop 指令---汇编学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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