PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   詢問『組合語言』加減乘除的問題 (https://www.pcdvd.com.tw/showthread.php?t=430233)

小P 2004-12-31 04:46 PM

詢問『組合語言』加減乘除的問題
 
剛學組合語言把書本範例改過寫出

X=(A*3+B*4)/E-2

引用:
.MODEL SMALL
.STACK
.DATA
A DB 1
B DB 2
E DB 5
D DB ?
DR DB ?
.CODE
.STARTUP
MOV AX,4
IMUL B
MOV BX,DX
MOV CX,AX
MOV AX,3
IMUL A
ADD AX,CX
ADC DX,BX
MOV CX,E
SUB CX,2
IDIV CX
MOV D,AL
MOV DR,AH
.EXIT
END


編譯出來會有顯示 MOV CX,E 這一段有問題,書上原範例是DW...改DB後被除數是AX商AL餘AH
,想了很久找不出解,不知道站上有誰知道^^

引用:
在別地方有詢問說CX是WORD(為什麼是WORD..書本上沒看到...),要將E MOV給CX應該用MOVZX(編譯也顯示錯誤,不過還是謝謝那位仁兄的回覆)


麻煩大家解答了,謝謝

wattlu 2004-12-31 05:35 PM

A*3+B*4
--------- =X
E-2

我改了一下,可以編譯了
不過功能沒出來
我看不懂你題目的意思,說明白一點好嗎

X是A*3+B*4嗎
E-2又是幹麻的

小P 2004-12-31 05:52 PM

引用:
作者wattlu
A*3+B*4
--------- =X
E-2

我改了一下,可以編譯了
不過功能沒出來
我看不懂你題目的意思,說明白一點好嗎

X是A*3+B*4嗎
E-2又是幹麻的

其實是算出
X=A*3+B*4/E-2 (我編輯過了,還是有人看不懂....呵呵)

然後用DUBUG看記憶體的變化....X是結果,E-2是E DB 5減2

....wattlu兄能把改的地方講出來嗎...不然我又要自己摸了...謝謝

wattlu 2004-12-31 07:08 PM

基本上,我覺得我好像幫不上什麼忙,先說聲抱歉

我不明白DW改成DB的用意是?
MOV CX,E這個用法是錯誤的,錯在哪?錯在你定義E DB 5
你自己想想看MOV CX,AL這種寫法成立嗎?
答案是不成立,8bit的東西不能直接放到16bit

我把我想出來的方法給你參考一下,不保證有用,因為我不會用DEBUG=.=,所以沒辦法驗證
用CBW指令:把AL轉成有號數AX

IMUL A
ADD AX,CX
ADC DX,BX
...mov bx,ax ;暫存,因要用到al
...mov al, e
...cbw ;al轉成ax 8bit放到16bit
...mov cx,ax ;這一步完成你之前的mov cx,e
...mov ax,bx ;放回
SUB CX,2
IDIV CX
MOV D,AL
MOV DR,AH
.EXIT
END

再次強調一下,我不明白你到底要將原本程式用什麼的寫法去改寫?
單純是將e dw 5 改成e db 5嗎?

因為我不知道你要用什麼去改寫原本程式...所以想的方法可能幫不上忙

小P 2004-12-31 07:27 PM

引用:
作者wattlu
基本上,我覺得我好像幫不上什麼忙,先說聲抱歉

我不明白DW改成DB的用意是?
MOV CX,E這個用法是錯誤的,錯在哪?錯在你定義E DB 5
你自己想想看MOV CX,AL這種寫法成立嗎?
答案是不成立,8bit的東西不能直接放到16bit

我把我想出來的方法給你參考一下,不保證有用,因為我不會用DEBUG=.=,所以沒辦法驗證
用CBW指令:把AL轉成有號數AX

IMUL A
ADD AX,CX
ADC DX,BX
...mov bx,ax ;暫存,因要用到al
...mov al, e
...cbw ;al轉成ax 8bit放到16bit
...mov cx,ax ;這一步完成你之前的mov cx,e
...mov ax,bx ;放回
SUB CX,2
IDIV CX
MOV D,AL
MOV DR,AH
.EXIT
END

再次強調一下,我不明白你到底要將原本程式用什麼的寫法去改寫?
單純是將e dw 5 改成e db 5嗎?

因為我不知道你要用什麼去改寫原本程式...所以想的方法可能幫不上忙

謝謝你的回答^^,我就是要把原本的DW改成DB來加減乘除,至於CX是原本範例程式的內容,我只把他當暫存器沒考慮是否是16位元....那MOVZX這個指令沒有用嗎?這個指令不是把八位元轉成16位元嗎~我知道為什麼CX是WORD了.....(新手別見怪)

wattlu 2004-12-31 07:42 PM

我會用DEBUG了
我之前打的程式有溢位、有錯
晚點再幫你修改
我要去烤肉了

pc 2004-12-31 08:18 PM

組合語言有夠難懂的,說是火星文還真的一點都不為過啊........

小P 2004-12-31 08:24 PM

引用:
作者wattlu
我會用DEBUG了
我之前打的程式有溢位、有錯
晚點再幫你修改
我要去烤肉了

謝謝...我已經改好了
引用:
ADD AX,CX
ADC DX,BX
>>MOV BL,E
>>CBW
>>MOV CX,BX
SUB CX,2
IDIV CX


因為BX在那一段以後就沒有用了,所以使用它的低位元組BL.....不知道這樣對不對...呵呵^^還沒測試

小P 2004-12-31 09:03 PM

引用:
.MODEL SMALL
.STACK
.DATA
A DB 1
B DB 2
E DB 5
D DB ?
DR DB ?
.CODE
.STARTUP

-MOV AX,4
-IMUL B
-MOV BX,3
-IMUL A
-ADD AL,BL
-ADC AH,BH

MOV DL,E
CBW
MOV CX,DX
SUB CX,2
IDIV CX
MOV D,AL
MOV DR,AH
.EXIT
END

改出來了...wattlu兄請查看是否對^^

asccpu 2004-12-31 09:33 PM

MOVZX 是386以上才有的指令,沒見你在原始程式啟用386以上的指令。
另 A*3+B*4 用移位做即行(左移)
A*3 可為 A左移1bit(*2)+A本身就是*3了
B*4 B左移2bit就是了
以上連乘法指令都免了

除法,用右移即是了,所有數值是整數比較好做。


所有的時間均為GMT +8。 現在的時間是12:39 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。