![]() |
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)
|
---|
引用:
太高深了...不知道asccpu兄,對我最後修改的程式碼有什麼高見...謝謝^^ ....用DEBUG驗證後-D 0B70:00 F 顯示資料段01 02 05 00 00 -G之後還是沒變....... |
引用:
.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 這是餘數 ...... :D .EXIT END 少了一些指令下去... (E-2) .... :D |
asccpu兄說:原本的程式是可以,不過可以不用帶符號運算 <<<<
原本程式是說我最後改的那一個嗎? 但是直接用 ADD AX,BX 後就找不到我的記憶體位址了 |
有關IMUL(MUL)方式和DIV同:
當作16*16位元運算時乘積是 DX:AX(32位元則是 EDX:EAX) 例如 AX*BX結果放在DX:AX中(同樣 EAX*EBX=EDX:EAX) |
引用:
看了一下,有問題: 所有乘除都是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 |
比起前兩天看到的問C++的
這樣問問題不是好多了嗎 |
所以,
-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 |
改過了
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 的回覆~但是商數跟餘數還是沒解出來,不知道是什麼問題 |
-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 |
看了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 |
所有的時間均為GMT +8。 現在的時間是06:43 PM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。