王爽組合語言實驗10除法溢位公式疑惑

2021-09-13 18:13:38 字數 3178 閱讀 6492

1樓:做而論道

把一個 32 位的數字 x,分成兩個 16 位的暫存器存放,如:

dx 為高字,ax 為低字。

用語言描述 x 時,就要說:x = dx * 65536 + ax。

程式設計時,分開存放,就行了。並不需要真的乘以 65536。

2樓:匿名使用者

其實相當於用c語言中的陣列,來解決,比如兩個陣列第一個放12第二個放34 現在把第一個陣列放前面第二個放後面連線在一起就變成1234,相當於12已經乘以100了,而現在變成二進位制而已,彙編**如下:

1;子程式名稱:divdw

2. ;功能:進行不會產生溢位的除法運算,被除數為dword型

3. ; 除數為word型,結果為dword型

4. ;引數: (ax)=dword型資料的低16位

5. ; (dx)=dword型資料的高16位

6. ; (cx)=除數

7. ;返回: (dx)=結果的高16位,(ax)=結果的低16位

8. ; (cx)=餘數

9. ;計算公式:x/n=int(h/n)*2^16+[rem(h/n)*2^16+l]/n

10. divdw:

11. jcxz divdw_return ;除數cx為0,直接返回

12. push bx ;作為一個臨時儲存器使用,先儲存bx的值

13.14. push ax ;儲存低位

15. mov ax, dx ;把高位放在低位中

16. mov dx, 0 ;把高位置0

17. div cx ;執行h/n,高位相除的餘數儲存在dx中

18. mov bx, ax ;把商儲存在bx暫存器中

19. pop ax ;執行rem(h/n)*2^16+l

20. div cx ;執行[rem(h/n)*2^16+l]/n,商儲存在ax中

21. mov cx, dx ;用cx暫存器儲存餘數

22. mov dx, bx ;把bx的值複製到dx,即執行int(h/n)*2^16

23. ;由於[rem(h/n)*2^16+l]/n已儲存於ax中,

24. ;即同時完成+運算

25. pop bx ;恢復bx的值

26. divdw_return:

27. ret

3樓:匿名使用者

在畫圈的地方 被除數是ax=4240h, dx=0005h

也就是     54240h/0ah=86a0h

所以最後部分還是 (rem(h/n)*65536+l)/n

彙編除法!非常疑惑。。

4樓:匿名使用者

「除法指令的被除數是隱含運算元,除數在指令中顯式地寫出來。cpu會根據除數是8位、16位,還是32位,來自動選用被除數ax、dx-ax,還是edx-eax。」

「組合語言中除法指令有兩種溢位的情況:一是被0除,產生0號中斷;二是當除得的商超出範圍時,即你所的除以位元組時商超出了位元組或者除以字時商超出了字,都會產生溢位。」

你用了 mov bl,10 也就是說你選擇了8位除數,那你的商也不能超過8位,所以你會產生除法溢位

所以你把除數換成bx就行了。商自動選擇為16位的。

5樓:

商在al裡存放不下,是不是就儲存到ax裡了?餘數就儲存到dx裡了啊?

想當然了,事實並非如此,

你要麼做更高位的除法,要麼自己做無溢位除法,就是把它拆成多個除法和加法

div16: ;名稱:div16

;功能:實現16位無溢位除法

;引數:dx-ax:被除數,bx:除數

;返回:dx-ax:商,bx:餘

;code folowing

push cx ;現場保護

;start

mov cx,ax

mov ax,dx

mov dx,0

div bx

push ax

mov ax,cx

div bx

mov bx,dx

pop dx

;end

pop cx ;恢復現場ret

6樓:文刀舍予

tnt你好

這個cpu沒你想的那麼聰明,那個結果溢位就是溢位了,它不會作出其他的像你說的那麼複雜的操作的

xor dx,dx

mov ax,12666

mov bx,10

div bx

7樓:匿名使用者

問題已經被你自己分析的很透徹了。

但你想想,既然已經要用到dx,而你實現時還只用ax在做被除數,所以要進行符號擴充套件cwd.

使ax->dx.ax

此時接受被除數時就應該用r16,你這裡當然是 bx了。**如下。我初學,不滿意地方還請見諒- -

.model small

.stack

.data

.code

.startup

mov ax,12666

cwdmov bx,10

div bx

mov cx,dx ;ah是餘數,al是商,ax商,dx餘數,將餘數儲存到cx儲存器中

jcxz ok ;判斷餘數是否為0

add cx,30h ;進行餘數+30h,轉化ascii碼

push cx ;進棧

pop [si] ;逆序出棧

add si,2 ;指標加2

ok: ret

.exit 0end

8樓:低智力生物

你這裡用的是

mov bl,10

應該改為

mov bx,10

9樓:這id能註冊不

應該是放在dl裡了,不要用dx吧.

組合語言實現定點原碼兩位乘法,組合語言實現定點原碼兩位乘法

data segment x db 存放被乘數 y db 存放成數 xb db 存放補碼 c db 0 z db 0 結果值的正負值 num db 輸入數字個數控制 str1 db input x str2 db input y str3 db output x y str4 db input er...

關於王爽的組合語言的加減乘除指令

王爽組合語言加減乘除指令分述如下 1 加法指令 指令格式 加法 add dst,src dst src dst 帶進位加法 adc dst,src dst src dst cf 加1 inc opr opr opr 1 2 減法指令 指令格式 減法 sub dst,src dst dst src 帶...

如何用組合語言實現微控制器比較轉移

pan clr cy mov 30h,a subb a,10 jb cy,prog1 mov a,30h clr cy subb a,20 jb cy,prog2 mov a,30h clr cy subb a,30 jb cy,prog3 prog1 nop prog2 nop prog3 nop...