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

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

  回應
 
主題工具
小P
Amateur Member
 

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

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

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


太高深了...不知道asccpu兄,對我最後修改的程式碼有什麼高見...謝謝^^

....用DEBUG驗證後-D 0B70:00 F
顯示資料段01 02 05 00 00
-G之後還是沒變.......
     
      

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

加入日期: Jan 2002
您的住址: U.S.S AGC
文章: 1,669
引用:
作者小P
太高深了...不知道asccpu兄,對我最後修改的程式碼有什麼高見...謝謝^^


.MODEL SMALL
.386 <--- 加這才能用386的指令,你用的是MASM?,沒加這MASM內定以x86指令為主。
這行放在此是16位元程式碼,但可使32位元暫存器,若放在.MODEL 之前則是32位元程式碼

.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
以上可以改成

MOVZX AX,A
SHL AX,1 ;*2
ADD AL,A ;*3

MOVZX BX,B
SHL BX,2 ; *4
ADD AX,BX ;A*3+B*4 --> AX

原本的程式是可以,不過可以不用帶符號運算,因為都是正數,除非其中是負值,則用原本方較方便
但,其中
  -ADD AL,BL
  -ADC AH,BH 直接用 ADD AX,BX 即可


MOV DL,E
CBW
MOV CX,DX
SUB CX,2
IDIV CX

改成
MOVZX BX,E
DEC BX
DEC BX
XOR DX,DX
IDIV BX (或DIV BX均可)
為何要把DX歸0?因為你要用16位元除法,據指令說明,當用16位元除法時,除數是DX:AX,除非改用另一方式:
MOV BL,E
DEC BL
DEC BL
DIV BL
算完後AX(AL)=商,DX(AH)=餘數,( )內是採用第二方法時

MOV D,AL 我猜這是商
MOV DR,AH 這是餘數 ......

.EXIT
END

少了一些指令下去... (E-2) ....
 
__________________
辭源數位化計劃啟始於2014年1月。請拜訪成果。

此文章於 2004-12-31 11:09 PM 被 asccpu 編輯.
舊 2004-12-31, 10:25 PM #12
回應時引用此文章
asccpu離線中  
小P
Amateur Member
 

加入日期: Aug 2000
您的住址: 公海
文章: 45
asccpu兄說:原本的程式是可以,不過可以不用帶符號運算 <<<<

原本程式是說我最後改的那一個嗎?

但是直接用 ADD AX,BX 後就找不到我的記憶體位址了
舊 2004-12-31, 10:40 PM #13
回應時引用此文章
小P離線中  
asccpu
Master Member
 

加入日期: Jan 2002
您的住址: U.S.S AGC
文章: 1,669
有關IMUL(MUL)方式和DIV同:
當作16*16位元運算時乘積是 DX:AX(32位元則是 EDX:EAX)
例如 AX*BX結果放在DX:AX中(同樣 EAX*EBX=EDX:EAX)
__________________
辭源數位化計劃啟始於2014年1月。請拜訪成果。
舊 2004-12-31, 10:41 PM #14
回應時引用此文章
asccpu離線中  
asccpu
Master Member
 

加入日期: Jan 2002
您的住址: U.S.S AGC
文章: 1,669
引用:
作者小P
asccpu兄說:原本的程式是可以,不過可以不用帶符號運算 <<<<

原本程式是說我最後改的那一個嗎?

但是直接用 ADD AX,BX 後就找不到我的記憶體位址了

看了一下,有問題:
所有乘除都是ACC暫存器為主(ACC就是AX(AH,AL,EAX)
所以
-MOV AX,4
-IMUL B
對,正確
-MOV BX,3
-IMUL A
這就錯了,AX內容變成(B*4)*A 了
此時BX=3

-ADD AL,BL
-ADC AH,BH
__________________
辭源數位化計劃啟始於2014年1月。請拜訪成果。

此文章於 2004-12-31 11:03 PM 被 asccpu 編輯.
舊 2004-12-31, 10:49 PM #15
回應時引用此文章
asccpu離線中  
醉鬼
New Member
 

加入日期: Sep 2004
您的住址: California
文章: 5
比起前兩天看到的問C++的
這樣問問題不是好多了嗎
舊 2004-12-31, 10:56 PM #16
回應時引用此文章
醉鬼離線中  
asccpu
Master Member
 

加入日期: Jan 2002
您的住址: U.S.S AGC
文章: 1,669
所以,
-MOV AX,4
-IMUL B
-MOV BX,3
-IMUL A
-ADD AL,BL
-ADC AH,BH
這段要改成:
MOV AX,4
IMUL B ;B*4

MOV CX,AX 結果暫存他處

MOV AX,3
IMUL A ;A*3

ADD AX,CX ; A*3+B*4
__________________
辭源數位化計劃啟始於2014年1月。請拜訪成果。
舊 2004-12-31, 10:59 PM #17
回應時引用此文章
asccpu離線中  
小P
Amateur Member
 

加入日期: Aug 2000
您的住址: 公海
文章: 45
改過了
MOV AX,4
IMUL B
MOV BX,AX <多加這一行
MOV AX,3
IMUL A

可是使用DUBUG還是驗證不出來的說...
-d 0b70:0 f 01 02 05 00 00
-g
-d 0b70:0 f 01 02 05 00 00
--------------------↑↑↑

謝謝asccpu 的回覆~但是商數跟餘數還是沒解出來,不知道是什麼問題
舊 2004-12-31, 11:08 PM #18
回應時引用此文章
小P離線中  
asccpu
Master Member
 

加入日期: Jan 2002
您的住址: U.S.S AGC
文章: 1,669
-A 100
0CE5:0100 MOV AX,4
0CE5:0103 IMUL BYTE PTR[0200]
0CE5:0107 MOV BX,AX
0CE5:0109 MOV AX,3
0CE5:010C IMUL BYTE PTR[0201]
0CE5:0110 ADD AX,BX
0CE5:0112 NOP
0CE5:0113 NOP
0CE5:0114 NOP
0CE5:0115 MOV BL,BYTE PTR [0202]
0CE5:0119 DEC BL
0CE5:011B DEC BL
0CE5:011D IDIV BL
0CE5:011F NOP
0CE5:0120 NOP
0CE5:0121 NOP
-E 200
0CE5:0200 02. 01. 00.5 ;分別是B,A,E值
-T

AX=0004 BX=128A CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0103 NV UP EI PL NZ AC PE CY
0CE5:0103 F62E0002 IMUL BYTE PTR [0200] DS:0200=02
-T

AX=0008 BX=128A CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0107 NV UP EI PL NZ AC PE NC
0CE5:0107 89C3 MOV BX,AX
-T

AX=0008 BX=0008 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0109 NV UP EI PL NZ AC PE NC
0CE5:0109 B80300 MOV AX,0003
-T

AX=0003 BX=0008 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=010C NV UP EI PL NZ AC PE NC
0CE5:010C F62E0102 IMUL BYTE PTR [0201] DS:0201=01
-T

AX=0003 BX=0008 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0110 NV UP EI PL NZ AC PE NC
0CE5:0110 01D8 ADD AX,BX
-T

AX=000B BX=0008 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0112 NV UP EI PL NZ NA PO NC
0CE5:0112 90 NOP
-T

AX=000B BX=0008 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0113 NV UP EI PL NZ NA PO NC
0CE5:0113 90 NOP
-T

AX=000B BX=0008 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0114 NV UP EI PL NZ NA PO NC
0CE5:0114 90 NOP
-T

AX=000B BX=0008 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0115 NV UP EI PL NZ NA PO NC
0CE5:0115 8A1E0202 MOV BL,[0202] DS:0202=05
-T

AX=000B BX=0005 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=0119 NV UP EI PL NZ NA PO NC
0CE5:0119 FECB DEC BL
-T

AX=000B BX=0004 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=011B NV UP EI PL NZ NA PO NC
0CE5:011B FECB DEC BL
-T

AX=000B BX=0003 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=011D NV UP EI PL NZ NA PE NC
0CE5:011D F6FB IDIV BL
-T

AX=0203 BX=0003 CX=000A DX=0000 SP=090E BP=0916 SI=0014 DI=0008
DS=0CE5 ES=5D0A SS=00A7 CS=0CE5 IP=011F NV UP EI PL NZ AC PO NC
0CE5:011F 90 NOP
-

商=3,餘2
__________________
辭源數位化計劃啟始於2014年1月。請拜訪成果。
舊 2004-12-31, 11:51 PM #19
回應時引用此文章
asccpu離線中  
wattlu
Basic Member
 

加入日期: Feb 2002
文章: 27
看了asccpu的DEBUG寫法後
按照小P的寫法去寫,小P參考一下吧
商和餘都可正確的求出了

.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,AX

MOV AX,3
IMUL A
ADD AX,BX

MOV DL,E
SUB DL,2

IDIV DL

MOV D,AL
MOV DR,AH

.EXIT
END
__________________
we cannot know the future because we cannot know the present.......uncertainty principle
舊 2005-01-01, 01:17 AM #20
回應時引用此文章
wattlu離線中  


    回應


POPIN
主題工具

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

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



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


vBulletin Version 3.0.1
powered_by_vbulletin 2025。