彙編的ADD指令組合語言中ADD加法指令的問題

2021-03-07 04:43:36 字數 3867 閱讀 9368

1樓:胖大海君

為你解答: 你使用哪個暫存器啊? 就替你選擇使用r5暫存器吧 另外暫存器加1功能

的實現的 最好使用現成的微控制器本身就有的加1指令 inc r5;就可以實現暫存器r5的加1 ;如果使用 add指令 一條完成不了 add指令必須以累加器a做為目的運算元 需要用到

mov a,r5 ;

add a,#1 ;

mov r5,a

三條指令才能實現來 指令**長 執行速度慢.

你的要求是每次按下 p1.3 暫存器內容加1 對吧

參考程式如下:

*** 0000h

ljmp main

*** 0100h

main: mov r5,#0 ; 暫存器清零

setb p1.3 ; 置p1.3口線為讀狀態

ll: jb p1.3, ll ; 等待p1.3鍵按下

lcall ys ; 延時去鍵盤 抖動

setb p1.3 ; 置p1.3口線為讀狀態

jb p1.3, ll ; 判斷p1.3鍵按下否? 如果沒有按下 轉ll繼續 等待p1.3鍵按下

inc r5 ;如果按下p1.3鍵 則入暫存器r5加1

sjmp ll ;迴圈繼續等待p1.3鍵按下

ys: mov r7,#15 ;延時子程式

yy: mov r6,#200

ss; djnz r6, ss

djnz r7,yy

retend

哈哈 幫你做完了 沒有加分沒關係 請替俺選擇(滿意回答)就可以

2樓:匿名使用者

add eax, dword ptr [ebp+10]這個是最快的,add eax, ecx這個是最慢的;add eax, dword ptr [ebp+10]是在新增指標,指標在彙編裡就相當於彙編指令;add eax, ecx 是在新增一個變數

所以在組合語言中指令一定是比立即數和變數執行速度快的,則立即數又比變數執行快。

希望對你有所幫助!!!

3樓:匿名使用者

指令的執行過程包括取指令,執行指令。

取指令指的是從cs:ip處取得指令放入指令佇列;執行指令指譯碼、具體操作。

add eax, 12 ;立即數

最快;因為運算元在指令中。直接在加法器中運算add eax, ecx

次之。因為運算元在暫存器。從暫存器取數比從指令中慢add eax, dword ptr [ebp+10]最慢。因為運算元在儲存器。從儲存器取數,需要額外的一個讀寫週期

組合語言中add加法指令的問題

4樓:閭丘芷荷乙曾

1.0ac72h只是一個表示方法,跟ac72h是一樣的含義。ax裡還是儲存16位的值。

之所以在前面多加一個0,是因為編譯器不識別以字母開頭的立即數。

算是立即數表示的一種規則吧,或者可以理解為是一種語法規則。

只要是十六進位制數的(最後加h),首位又是字母的,必須前面新增個0。

這樣也不容易引起歧義。

如果不習慣加0,那mov

al,dh這個指令怎麼識別呢?

是把8位暫存器dh裡的值交給al?還是把十六進位制數0dh交給al呢。。。

所以建議你養成這樣的習慣。

2.0f表示溢位,實際上是把add指令作為有符號數加法指令。ax開始是正數(最高位0),bx也正數,相加結果超過了能識別的最大正數(7fffh),所以溢位了。

5樓:革盼秋宇恬

89h+

89h=

112h,而al最大是ffh,產生溢位後就生產丟失現象,只保留低位。

要想不丟失,可改為:

xorah,ah

addax,al

則ax是正確的112h

其他高階語言也一樣,在宣告變數和計算時要考慮數字溢位問題(宣告的是short型變數,給的卻是int型值,得到的也只會是short型的值即丟失或報錯)

6樓:做而論道

無論,是有符號還是無符號的,演算法都是相同的。

即:89h + 89h = (1)12h。

相當於無符號:137 + 137 = 274 = 256 + 18。 256 即為進位 1。

相當於有符號:(-119) + (-119) = +18。 溢位,結果無效。

換一個數,再試試,有符號數,也可以得出正確的結果。

7樓:匿名使用者

不是的,雖然算數運算指令主要用來對8位無符號資料進行算術操作,但也同樣用於帶符號數的。

在加法運算中,若位7有進位,則進位位cy置1,否則清0;若位3有進位,則半進位位ac置1,否則清0。若看作2個帶符號數相加,還需判斷溢位位ov;若ov為1,表示和數溢位。

例如:a=aeh,r1=81h,執行指令「add a,r1」,則操作如下所示。

1 0 1 0 1 1 1 0

+ )1 0 0 0 0 0 0 1

——————————

1 0 0 1 0 1 1 1 1

結果:a=2fh,cy=1,ov=1,ac=0,p=1。

此例中,若把aeh、81h看作無符號數相加,則結果為12fh(在看作無符號數時,不考慮ov位);若將上述2值看作有符號數,則有「2個負數相加得到正數」的錯誤結論,此時,ov=1,表示有溢位,指出了這一錯誤。

希望能幫到你。

8樓:匿名使用者

無符號數的範圍是0-255,有符號數是-128 - 127.應該預設是無符號數,另外標誌暫存器裡有個of位它是針對有符號數的,如果是mov al,7fh add al,1 of位會置1 顯示有符號數溢位,因為7fh+1=128大於了有符號數的表示範圍。

9樓:夕見的

將al的內容直接相加(注意的是要進行的是十六進位制的加法,而不是十進位制的)後送到al暫存器中

急~~~求助組合語言中mov指令和add指令用法

10樓:匿名使用者

1、linux和windows的**編寫是不一樣的,linux上的彙編風格是at&t風格,而windows上的彙編風格是intel風格。 其中的一個區別是intel 風格是關於源運算元和目的運算元的。以第一個為例

//windows上的寫法

mov eax, data4

//linux上的寫法

movl data4, eax

所以,你使用的哪個平臺你得鬧明白。

2、如果是彙編**,直接用識別符號就好,還是不同的風格問題,如果按你寫的立即數模式。

//windows上的寫法

mov eax, -1000

//linux上的寫法

movl $-1000, eax

在linux的at&t彙編風格中,它這個立即數是必須要加上$ 表示一個常量。 這個也是為什麼你在c語言中一般不能使用$來做為識別符號的一個原因哦。

建議:查一下intel風格和at&t風格的彙編區別點。問題都很簡單,為了更好的幫助你,我上傳了一份,詳細介紹intel組合語言程式設計的電子書,中文版的,希望能幫到你!

組合語言中st指令什麼意思組合語言中,ST指令什麼意思?

st是store的簡寫,ld是load簡寫,前面一個是寫,後面一個是讀。st是源暫存器 儲存區,ld是儲存區 目的暫存器。字資料傳送指令 ld,st 這是最簡單的資料傳送指令,不用考慮符號位的問題,直接以機器的位長存取資料。ld 從記憶體中取32位字資料放人暫存器,st將暫存器中的32位字資料儲存到...

彙編JB指令,組合語言中JB,JA,是什麼意思

jb是指判斷位變數轉移指令,ja jump above 大於則轉移到目標指令執行。jb p1.3,l1意思就是說判斷p1.3的值是不是 1 如果是就跳轉到l1程式執行,如果不是就順序執行下一條指令。jnae jump not above and equal 低於,即不高於且不等於則轉移,但執行這條語...

組合語言中ptr的作用是什麼,組合語言中CMP的作用是什麼?

ptr應該就是pointer 說明地址指標型別。當兩個運算元型別均不明確時,必須用byte ptr 位元組屬性 或word ptr 字屬性 將一個儲存器運算元定義為位元組或字型別。如 mov byte ptr si oah 指明 si 為位元組型別 在沒有暫存器名存在的情況下,用操作符 x ptr ...