2013-05-20 113 views
0

我有這樣的代碼添加16位寄存器

addInt: 
     add cx, bx 
     cmp cx, 0FFFFh 
     JBE convert 

我想補充CX和BX寄存器,每個有FFFF相同的值,而不是讓1FFFE,我只得到FFFE,當我嘗試使用JBE跳轉到循環,JBE istruction不做任何事情,因爲ecx現在註冊只包含FFFE,但不包含1FFF,所以我該如何解決此代碼,使ecx包含1FFFE,我如何比較以檢查它是否仍然是16或不是。我不能使用任何32位寄存器,這使得事情更加複雜

預先感謝

+2

一個16位的寄存器可以包含的最大值是'FFFF' .. – Blorgbeard

+1

爲什麼你不能使用32位寄存器? (如果你使用'ecx',這會容易得多。) – michaelb958

+0

如果你在'add'指令後面檢查'FLAGS'中的'OF'(溢出標誌),它可能會有所幫助。 –

回答

1
addInt: 

    clc   ;clear carry flag 

    add cx,bx 

    jnc convert ;jump no carry 

    cmp cx,FFFEh ;This now needs to be true, only FFFF+FFFF will succeed 

        because it generates a carry AND matches the cmp 

    Jnz convert ;will let it through 

這是可行的,但它是非常有限的,簡單的

要「算」進使用ADC DX, 0 JNC之後插入轉換

進位標誌置位,如果寄存器繞着時鐘,因此它的作用就像一個單比特

ADD FFFF + 2將將其關閉,使用進位標誌讓您在寄存器

可以存儲標誌與ADC [另冊]單獨計數寄存器,0

A +已經進位標誌和0001允許你拍你的寄存器一起數到像

1,208,741,363,432,547,555,475,424與4X16位寄存器

這是不少哩優於65,534

+0

那麼如果我想比較任何大於16位值的總和,我應該怎麼做? – bluebk

+0

第一部分是這樣的,jnc – ady

+0

如果你想在16位環境中比較兩個大於16位的數字,那麼你將需要學習如何使用多個寄存器 – ady

相關問題