日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

匯編中的循環(huán)

程序員cxuan ? 來源:程序員cxuan ? 作者:程序員cxuan ? 2022-04-25 10:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

匯編系列其實也在一直更新,只不過更新的頻率會挺慢的。。。由于白天一直忙于工作,空閑時間還要看書、學習各種技術棧,早上也要抽時間早期健身,晚上回家還要陪家人 + 學習,時間安排的滿滿當當,所以我就慢慢寫,各位讀者也別太著急,我其實真想再分一個自己出來。

之前的文章中介紹過 [0] 表示的是內(nèi)存單元,它一般存儲在 ds 寄存器中,偏移地址為 0 。比如下面的指令

mov ax,[0]

就是將一個內(nèi)存單元的內(nèi)容送入 ax,這個內(nèi)存單元的長度為 2 個字節(jié),正好存放一個字型數(shù)據(jù),偏移地址為 0 ,段地址在 ds 中。這種尋址方式相當于是直接尋址。

比如下面代碼

mov al,[0]

就是將一個內(nèi)存單元的地址送入 al 中,這個內(nèi)存單元的長度是 1 字節(jié),存放字節(jié)型數(shù)據(jù),偏移地址為0 ,段地址在 ds 中。

所以要描述一個完整的一個內(nèi)存單元,應該需要兩種信息:即內(nèi)存單元的地址和內(nèi)存單元的長度。

比如我們要讀取一個 10000H 的數(shù)據(jù),你可能會需要下面這段代碼。

mov bx,10000H
mov ds,bx
mov al,[0]

上面這三條指令就把 10000H 讀取到了 al 中。

但是表示內(nèi)存地址的方式不只有直接指定其內(nèi)存地址,還可以用一種間接尋址的方式,比如 [bx],它表示的是一種寄存器間接尋址,也是一種偏移地址,同樣的,比如我們要讀取一個 10000H 的數(shù)據(jù),使用 [bx] 這種方式的代碼如下(假設 ds = 1000H)

mov bx,1
mov ax,[bx]

這樣計算機就會尋找段地址為 1000H,偏移地址為 0001H 的數(shù)據(jù)放入到 ax 中。

它的中文解釋就是 把 [bx] 指向的地址中的內(nèi)容,送入 ax 寄存器中。

比如下面這段代碼

mov ax,[bx]

它表示的就是將偏移地址為 bx 的數(shù)據(jù),送入到 ax 中,送入的內(nèi)存單元地址是 2 個字節(jié),存放字型數(shù)據(jù)。

又比如下面這段代碼

mov al,[bx]

它表示的就是將偏移地址為 bx 的數(shù)據(jù),送入到 al 中,送入的內(nèi)存單元地址是 1 個字節(jié),存放字節(jié)型數(shù)據(jù)。

[bx] 這種間接尋址的好處就是每次偏移地址不是固定的,這為我們接下來的循環(huán)指令奠定了基礎。

為了更方便描述后面,我們后面使用 () 來表示一個寄存器或者內(nèi)存單元中的內(nèi)容。

這里需要注意一下,() 內(nèi)的表示的元素一般有三種類型:

  • 寄存器名,比如 (ax) 就表示 ax 中的內(nèi)容,(al) 就表示 al 中的內(nèi)容。
  • 段寄存器名,比如 (ds) 就表示段寄存器 ds 中的內(nèi)容。
  • 內(nèi)存單元的物理地址,比如 ((ds) * 16 + (bx)),一個 20 位的數(shù)據(jù)。

我們知道,寄存器存儲的數(shù)據(jù)類型有兩種,字型和字節(jié)型,字型數(shù)據(jù)一般用 ax 這類寄存器來存儲,字節(jié)型數(shù)據(jù)一般用 ah 、al 這種寄存器來存儲。

同樣的,() 內(nèi)的數(shù)據(jù)類型也有兩種,字型和字節(jié)型。比如 (al)、(bl)、(cl) 這種表示的數(shù)據(jù)就是字節(jié)型,而 (ax)、(bx)、(cx) 表示的數(shù)據(jù)就是字型。

在了解完上述的這些知識點后,我們就可以來正式看一下 [bx] 了。

[BX]

再來啰嗦一下 [bx] 的尋址方式,比如下面代碼

mov ax,[bx]

bx 中存放的數(shù)據(jù)作為一個偏移地址,這里用 EA 表示(沒有其他意思,只是單純地表示偏移地址),段地址在 ds 中,用 SA 表示(同 EA 的解釋),將 SA:EA 處的數(shù)據(jù)送入 ax 中,即 (ax) = ((ds) * 16 + (bx))。

可以將內(nèi)存單元送入寄存器中,也可以將寄存器的數(shù)據(jù)送入到內(nèi)存單元中,如下代碼所示

mov [bx],ax

就是將 ax 中的數(shù)據(jù)送入到 SA:EA 處,即 ((ds) * 16 + (bx)) = (ax)。

為了讓大家加深對 [bx] 的認識,我們通過一些匯編指令來認識一下程序的執(zhí)行過程,代碼如下

mov ax,2000H
mov ds,ax
mov bx,1000H
mov ax,[bx]
inc bx
inc bx
mov [bx],ax
inc bx
inc bx
mov [bx],ax
inc bx
mov [bx],al
inc bx
mov [bx],al

下面我們就按照每一行指令來分析一下

首先,mov ax,2000H 就是將 2000 送入 ax 中,mov ds,ax 就是將設置段地址為 2000 H,mov bx,1000H 就是將 1000 送入 bx 中,mov ax,[bx] 就是將 2000:1000 處的地址送入到 ax 中(因為段基址為 2000,偏移地址 dx 為 1000),2000H:1000H 處的指令是 00be,所以 ax = 00BEH ,存儲字型數(shù)據(jù),示意圖如下

e596c552-c42c-11ec-bce3-dac502259ad0.png

inc bx 就是將寄存器 bx 的值加 1,此處有兩條 inc 指令,所以執(zhí)行完成后 bx = 1002H,此處段基址:偏移地址為 2000H:1002H。

然后下面 (第七行指令)mov [bx],ax 就是將 ax 中的數(shù)據(jù)送入到 [bx] 中,也就是 1002H 處,指令執(zhí)行后,2000:1002 單元的內(nèi)容為 BE,2000:1003 單元的內(nèi)容為 00,存放字型數(shù)據(jù),執(zhí)行完成后的示意圖如下

e5a21d3a-c42c-11ec-bce3-dac502259ad0.png

繼續(xù)執(zhí)行第 8、9 行的指令,inc bx ,執(zhí)行完成后 bx = 1004H,然后執(zhí)行第 10 行指令 mov [bx],ax ,指令執(zhí)行前:ds = 2000H,bx = 1004H,mov [bx],ax 相當于是把 ax 中的數(shù)據(jù)送到 2000:1004 處,指令執(zhí)行完成后,2000:1004 的單元內(nèi)容為 BE,2000:1005 的單元內(nèi)容為 00 ,如下示意圖所示

e5c1a7d6-c42c-11ec-bce3-dac502259ad0.png

接下來執(zhí)行第 11 行指令,inc bx,執(zhí)行完成后 bx = 1005H,mov [bx],al 是把 al 中的數(shù)據(jù)送入內(nèi)存 2000:1005 處,指令執(zhí)行完成后,2000:1005 處的單元內(nèi)容為 BE,如下示意圖所示

e5e455d8-c42c-11ec-bce3-dac502259ad0.png

繼續(xù)執(zhí)行指令,第13、14 行指令和 11 、12 行指令一樣,它的意思就是將 bx 的值加1之后,將 al 的值送入到指定地址處,執(zhí)行完成后的 ds = 2000H,bx = 1006H,所以 2000:1006 處的內(nèi)容是 BE(al 存儲的數(shù)據(jù)),示意圖如下

e61467b4-c42c-11ec-bce3-dac502259ad0.png

想必大家跟完上面的流程后,應該對 [bx] 這個間接尋址方式有了比較深刻的認識。

下面想個問題,使用匯編編程計算 2 * 2 ,并將結果存儲在 ax 寄存器中。

這個思路還是比較簡單的,直接將 2 放在 ax 寄存器中,然后執(zhí)行 ax 的 add 操作就可以了,下面是匯編代碼

assume cs:codesg
codesg segment
 mov ax,2
 add ax,ax
 
 mov ax,4c00h
 int 21h
codesg ends
end

上面這段代碼中的計算量還比較低,但是如果要讓你計算 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 呢,你難道要寫 n 個 add ax,ax 嗎?

assume cs:codesg
codesg segment
 mov ax,2
 add ax,ax
 add ax,ax
 add ax,ax
 add ax,ax
 。。。
 
 mov ax,4c00h
 int 21h
codesg ends
end

這就很繁瑣啊,所以不能這么玩,那該怎么搞呢?這里就需要一種能夠循環(huán)執(zhí)行add ax,ax 的指令了,這個指令就是 Loop

Loop 指令

Loop 指令能夠循環(huán)判斷是否執(zhí)行指定的指令,它的執(zhí)行流程就相當于我們 Java 中的 for 循環(huán)。

我們先來使用 Loop 改寫一下上面 n 個 2 相乘的代碼,然后再講解一下 Loop 的使用。

assume cs:codesg
codesg segment
mov ax,2
mov cx,8
s: add ax,ax
loop s

mov ax,4c00h
int 21h
codesg ends
end

可以看到,我們使用 8 個 2 相乘的代碼被優(yōu)化的這么簡單,這就是 loop 指令的精髓所在。

其實關鍵代碼就是三條指令,即

  • mov cx,8
  • s: add ax,ax
  • loop s

翻譯過來的意思就是將 8 放在 cx 中,然后給 add ax,ax 處設置一個標號,然后執(zhí)行 s 循環(huán)。

loop 指令的格式是:loop 標號,CPU 執(zhí)行 loop 指令的時候,要進行兩步操作,第一步:(cx) = (cx) - 1,第二步:判斷 cx 的值,不為 0 則轉(zhuǎn)至標號(上面代碼是 s)處繼續(xù)執(zhí)行指令,如果為 0 則向下執(zhí)行(上面代碼中向下繼續(xù)執(zhí)行就是 mov ax,4c00h)。上面代碼中,我們把 8 送入了 cx 中,也就是說,cx 中存儲的就是執(zhí)行次數(shù)。

下面我們詳細介紹一下上面這段程序的執(zhí)行過程,從中體會一下 cx 和 loop s 是如何配合實現(xiàn)循環(huán)的。

(1) 執(zhí)行 cx,8 ,設置 cx = 8

(2) 執(zhí)行 add ax,ax(第 1 次)

(3) 執(zhí)行 loop s 將 cx 的值 - 1,此時 (cx) = 7,(cx) != 0 ,所以轉(zhuǎn)至 s 處

(4) 執(zhí)行 add ax,ax(第 2 次)

(5) 執(zhí)行 loop s 將 cx 的值 - 1,此時 (cx) = 6,(cx) != 0 ,所以轉(zhuǎn)至 s 處

(6) 執(zhí)行 add ax,ax(第 3 次)

(7) 執(zhí)行 loop s 將 cx 的值 - 1,此時 (cx) = 5,(cx) != 0 ,所以轉(zhuǎn)至 s 處

(8) 執(zhí)行 add ax,ax(第 4 次)

(9) 執(zhí)行 loop s 將 cx 的值 - 1,此時 (cx) = 4,(cx) != 0 ,所以轉(zhuǎn)至 s 處

(10) 執(zhí)行 add ax,ax(第 5 次)

(11) 執(zhí)行 loop s 將 cx 的值 - 1,此時 (cx) = 3,(cx) != 0 ,所以轉(zhuǎn)至 s 處

(12) 執(zhí)行 add ax,ax(第 6 次)

(13) 執(zhí)行 loop s 將 cx 的值 - 1,此時 (cx) = 2,(cx) != 0 ,所以轉(zhuǎn)至 s 處

(14) 執(zhí)行 add ax,ax(第 7 次)

(15) 執(zhí)行 loop s 將 cx 的值 - 1,此時 (cx) = 1,(cx) != 0 ,所以轉(zhuǎn)至 s 處

(16) 執(zhí)行 add ax,ax(第 8 次)

(15) 執(zhí)行 loop s 將 cx 的值 - 1,此時 (cx) = 0,(cx) == 0 ,所以轉(zhuǎn)至 s 處

(16) 執(zhí)行 mov ax,4c00h(循環(huán)結束)

從上面這個過程中,我們可以總結出用 cx 和 loop 指令相配合實現(xiàn)循環(huán)功能的 3 點注意事項:

  • 在 cx 中存放循環(huán)次數(shù)。
  • loop 指令中的標號所標識的地址要在前面
  • 要循環(huán)執(zhí)行的程序段,要寫在標號和 loop 指令的中間。

所以綜上所述,使用 Loop 和 cx 相配合實現(xiàn)的循環(huán)功能的結構如下:

mov cx,循環(huán)次數(shù)
s: 
循環(huán)執(zhí)行的程序段
loop s

比如我們想用 Loop 循環(huán)計算出 123 * 456 這個值,就可以使用這種方式

assume cs:codesg
codesg segment
mov ax,0
mov cx,456
s:add ax,123
loop s

mov ax,4c00h
int 21h
codesg ends
end

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5621

    瀏覽量

    130459
  • 匯編
    +關注

    關注

    2

    文章

    214

    瀏覽量

    27618

原文標題:原來匯編中的循環(huán)是這么玩兒的

文章出處:【微信號:cxuangoodjob,微信公眾號:程序員cxuan】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    什么是熱循環(huán)試驗?有哪些設備?怎么做熱循環(huán)試驗?

    循環(huán)試驗,也稱為溫度循環(huán)試驗、高低溫循環(huán)試驗,是一種在常壓下進行試件溫度循環(huán)的可靠性試驗,用于評估材料、組件或產(chǎn)品在溫度變化條件下的耐久性和可靠性。通過模擬實際使用過程
    的頭像 發(fā)表于 04-22 15:20 ?126次閱讀
    什么是熱<b class='flag-5'>循環(huán)</b>試驗?有哪些設備?怎么做熱<b class='flag-5'>循環(huán)</b>試驗?

    【快速溫變循環(huán)】快速溫變循環(huán)試驗箱的“循環(huán)”之道:宏展科技如何定義“一個循環(huán)

    在軍工、航天、汽車電子等高端制造領域,快速溫變循環(huán)試驗是驗證產(chǎn)品可靠性的核心手段。然而,“一個循環(huán)”到底如何定義?是簡單的升降溫,還是對速率、駐留時間、溫變曲線精度、循環(huán)重復性的嚴苛約束?廣東宏展
    的頭像 發(fā)表于 04-16 09:38 ?345次閱讀
    【快速溫變<b class='flag-5'>循環(huán)</b>】快速溫變<b class='flag-5'>循環(huán)</b>試驗箱的“<b class='flag-5'>循環(huán)</b>”之道:宏展科技如何定義“一個<b class='flag-5'>循環(huán)</b>”

    功率循環(huán)基礎篇(二) —— 功率循環(huán)壽命曲線解讀

    功率循環(huán)壽命曲線是評估功率半導體器件(如 ?IGBT?模塊)在溫度交變應力下長期可靠性的核心工具。該曲線通常以 結溫波動幅度?ΔTj 為橫坐標,以器件達到指定失效判據(jù)前所經(jīng)歷的 循環(huán)次數(shù)?Nf 為
    的頭像 發(fā)表于 03-02 11:55 ?388次閱讀
    功率<b class='flag-5'>循環(huán)</b>基礎篇(二) —— 功率<b class='flag-5'>循環(huán)</b>壽命曲線解讀

    汽車熱管理循環(huán)泵車規(guī)電容:-55℃~150℃寬溫+1000次溫度循環(huán)

    在汽車熱管理循環(huán),采用 -55℃~150℃ 寬溫工作能力 + 1000次溫度循環(huán) 的車規(guī)電容,是保障系統(tǒng)在極端環(huán)境下穩(wěn)定運行的核心元件。
    的頭像 發(fā)表于 02-25 17:14 ?584次閱讀

    在Keil中進行C代碼與匯編代碼的混合編程

    ,在匯編卻不能正確運行,程序執(zhí)行 BX lr 后會返回到 BL dummy 的下一句代碼 MOV Ro,#12 前,從而形成死循環(huán): LOOP_END BL dummy; 調(diào)用了 C 語言中的函數(shù)
    發(fā)表于 01-23 06:36

    編寫簡單高效單片機匯編程序

    :按鍵去抖和按鍵事件處理可以用一個中斷和簡單的邏輯實現(xiàn),而不是每個按鍵都獨立編寫邏輯。 2、指令優(yōu)化與循環(huán)結構 在匯編循環(huán)和條件跳轉(zhuǎn)往往會消耗更多指令周期,因此優(yōu)化
    發(fā)表于 11-24 07:00

    內(nèi)聯(lián)匯編的妙用

    它數(shù)據(jù)相關,于是借助循環(huán)變量i,做累加操作,但結果還是不對。 3、內(nèi)聯(lián)匯編(結果正確) 一覺醒來,突然想到內(nèi)聯(lián)匯編,決定一試:既然編譯器不能如我所愿,那可以把想要的部分先自己編譯。各種架構在線編譯
    發(fā)表于 10-31 06:28

    簡單的內(nèi)聯(lián)匯編介紹

    前言1、在程序我們可以嵌入匯編直接對我們加入的硬件進行相應的操作 2、在RISC-V架構定義的CSR寄存器需要使用特殊的 CSR 指令進行訪問,如果在 C/C++程序需要使用 C
    發(fā)表于 10-30 08:04

    RISC-V的工具鏈GCC內(nèi)聯(lián)匯編

    具體實現(xiàn)方法和步驟 在RISC-V架構定義的CSR寄存器需要使用特殊的CSR指令進行訪問,如果C、C++程序需要訪問CSR寄存器,只能使用內(nèi)嵌匯編指令的方法。在C、C++程序嵌入
    發(fā)表于 10-30 06:59

    蜂鳥自定義指令軟件講解和內(nèi)聯(lián)匯編(一)

    使用“ %數(shù)字”的方式進行隱含指定。 “數(shù)字”從 0 開始,依次表示輸出操作數(shù)和輸入操作數(shù)。假設包含“輸出操作數(shù)”列表中有 2 個操作數(shù),“輸入操作數(shù)”列表中有 2 個操作數(shù),則匯編程序%0 表示
    發(fā)表于 10-24 10:51

    GCC內(nèi)聯(lián)匯編

    GCC內(nèi)聯(lián)匯編 在蜂鳥內(nèi)核的NICE協(xié)處理器擴展demo的insn.h文件存在下面一段指令,用于定義對協(xié)處理器調(diào)用指令,demo協(xié)處理器支持三條指令:lbuf從內(nèi)存load數(shù)據(jù)
    發(fā)表于 10-24 07:46

    人工智能行業(yè)如何使用for循環(huán)語句進行循環(huán)

    人工智能行業(yè)可以使用以下是關于for循環(huán)在不同編程語言中的基本用法說明: Python的for循環(huán): 主要用于遍歷序列(列表、元組、字符串等) 典型結構:for item in sequence
    的頭像 發(fā)表于 09-10 12:55 ?717次閱讀

    基礎篇3:掌握Python的條件語句與循環(huán)

    在Python編程語言中,條件語句和循環(huán)是構成復雜邏輯和數(shù)據(jù)處理的基石。本篇基礎教程將幫助您深入了解Python的條件語句和循環(huán)結構,讓您能夠更好地控制程序流程。 條件語句 條件語句允許程序根據(jù)
    發(fā)表于 07-03 16:13

    匯編語言教學中文資料

    電子發(fā)燒友網(wǎng)站提供《匯編語言教學中文資料.rar》資料免費下載
    發(fā)表于 06-30 15:15 ?7次下載

    溫度(濕熱)循環(huán)試驗箱在鋰硫電芯測試的應用

    溫度(濕熱)循環(huán)試驗是一種環(huán)境加速老化試驗方法,通過交變的高溫、低溫與高濕條件,模擬鋰硫電芯在極端環(huán)境的熱脹冷縮、濕度應力、電解液反應等多因素影響。該試驗有助于提前揭示電芯結構、材料體系或工藝
    的頭像 發(fā)表于 06-04 09:14 ?230次閱讀
    溫度(濕熱)<b class='flag-5'>循環(huán)</b>試驗箱在鋰硫電芯測試<b class='flag-5'>中</b>的應用
    峨山| 绥宁县| 昂仁县| 元阳县| 西昌市| 固镇县| 太仓市| 普陀区| 扶余县| 仪陇县| 平塘县| 抚宁县| 云林县| 安溪县| 阳江市| 万盛区| 平江县| 聂拉木县| 中西区| 陇南市| 双牌县| 江口县| 南陵县| 澄城县| 建阳市| 龙里县| 宁武县| 康定县| 囊谦县| 交口县| 濉溪县| 韶山市| 隆尧县| 崇州市| 大丰市| 新泰市| 法库县| 曲松县| 阳信县| 临城县| 新昌县|