PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

  回應
 
主題工具
小P
Amateur Member
 

加入日期: Aug 2000
您的住址: 公海
文章: 45
Talking 詢問『組合語言』加減乘除的問題

剛學組合語言把書本範例改過寫出

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(編譯也顯示錯誤,不過還是謝謝那位仁兄的回覆)


麻煩大家解答了,謝謝
     
      

此文章於 2004-12-31 05:55 PM 被 小P 編輯. 原因: 再改一次
舊 2004-12-31, 04:46 PM #1
回應時引用此文章
小P離線中  
wattlu
Basic Member
 

加入日期: Feb 2002
文章: 27
A*3+B*4
--------- =X
E-2

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

X是A*3+B*4嗎
E-2又是幹麻的
 
__________________
we cannot know the future because we cannot know the present.......uncertainty principle
舊 2004-12-31, 05:35 PM #2
回應時引用此文章
wattlu離線中  
小P
Amateur Member
 

加入日期: Aug 2000
您的住址: 公海
文章: 45
Red face

引用:
作者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兄能把改的地方講出來嗎...不然我又要自己摸了...謝謝
舊 2004-12-31, 05:52 PM #3
回應時引用此文章
小P離線中  
wattlu
Basic Member
 

加入日期: Feb 2002
文章: 27
基本上,我覺得我好像幫不上什麼忙,先說聲抱歉

我不明白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嗎?

因為我不知道你要用什麼去改寫原本程式...所以想的方法可能幫不上忙
__________________
we cannot know the future because we cannot know the present.......uncertainty principle

此文章於 2004-12-31 07:12 PM 被 wattlu 編輯.
舊 2004-12-31, 07:08 PM #4
回應時引用此文章
wattlu離線中  
小P
Amateur Member
 

加入日期: Aug 2000
您的住址: 公海
文章: 45
Talking

引用:
作者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了.....(新手別見怪)
舊 2004-12-31, 07:27 PM #5
回應時引用此文章
小P離線中  
wattlu
Basic Member
 

加入日期: Feb 2002
文章: 27
我會用DEBUG了
我之前打的程式有溢位、有錯
晚點再幫你修改
我要去烤肉了
__________________
we cannot know the future because we cannot know the present.......uncertainty principle
舊 2004-12-31, 07:42 PM #6
回應時引用此文章
wattlu離線中  
pc
Elite Member
 
pc的大頭照
 

加入日期: Nov 1999
您的住址: Arlington, Texas
文章: 6,045
組合語言有夠難懂的,說是火星文還真的一點都不為過啊........
__________________
My PC:
AMD Athlon64 3500+ S939 2200mhz
Corsair DDR500 512MB*2
Abit AV8 K8T800 Pro
Hitachi HDS72251 6VLAT80 SCSI Disk Device 160GB/8MB Buffer
Pioneer DVD-RW DVR-110D
LITE-ON LTR-52327S USB2.0 CD-RW
PNY Verto GeForce 6800 GT 256MB
Linksys Wireless-G PCI Adapter
Creative Sound Blaster Audigy 2 ZS
ViewSonic A71f+
ViewSonic VX2025WM
Creative Inspire P5800
ASUS A2428PDV
Microsoft XBOX 360
舊 2004-12-31, 08:18 PM #7
回應時引用此文章
pc離線中  
小P
Amateur Member
 

加入日期: Aug 2000
您的住址: 公海
文章: 45
Talking

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

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


因為BX在那一段以後就沒有用了,所以使用它的低位元組BL.....不知道這樣對不對...呵呵^^還沒測試
舊 2004-12-31, 08:24 PM #8
回應時引用此文章
小P離線中  
小P
Amateur Member
 

加入日期: Aug 2000
您的住址: 公海
文章: 45
Talking

引用:
.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兄請查看是否對^^

此文章於 2004-12-31 09:30 PM 被 小P 編輯.
舊 2004-12-31, 09:03 PM #9
回應時引用此文章
小P離線中  
asccpu
Master Member
 

加入日期: Jan 2002
您的住址: U.S.S AGC
文章: 1,669
MOVZX 是386以上才有的指令,沒見你在原始程式啟用386以上的指令。
另 A*3+B*4 用移位做即行(左移)
A*3 可為 A左移1bit(*2)+A本身就是*3了
B*4 B左移2bit就是了
以上連乘法指令都免了

除法,用右移即是了,所有數值是整數比較好做。
__________________
辭源數位化計劃啟始於2014年1月。請拜訪成果。
舊 2004-12-31, 09:33 PM #10
回應時引用此文章
asccpu離線中  


    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是04:50 PM.


vBulletin Version 3.0.1
powered_by_vbulletin 2025。