彙編水仙花關於暫存器問題求大佬解答

2021-10-25 07:43:23 字數 4027 閱讀 3054

編一函式fun(int num)用於判斷整數num是否是水仙花數。所謂「水仙花數」是指乙個3位數,其各位數字立方和等於該數本身,如153=13+53+33。

執行後輸入:

153則結果輸出:

是水仙花數

執行後輸入:

123則結果輸出:

不是水仙花數

請在;【/和;】/之間編寫程式。

/源程式asm/

.386 ;選擇的處理器

.model flat, stdcall ;儲存模型,win32程式只能用平展(flat)模型

option casemap:none ;指明識別符號大小寫敏感

include kernel32.inc ;要引用的標頭檔案

includelib kernel32.lib ;要引用的庫檔案

includelib msvcrt.lib ;引用c庫檔案

scanf proto c:dword,:vararg ;c語言scanf函式原型宣告

printf proto c:dword,:vararg ;c語言printf函式原型宣告

.data ;⑤資料段

fmt byte 『%d』,0 ;定義變數

fmt2 byte 『%s』,0 ;定義變數

number dword 0

s1 byte 『是水仙花數』,0

s2 byte 『不是水仙花數』,0

.code ;⑥**段

;【/;】/

start: ;定義標號start

invoke scanf,addr fmt,addr number ;輸入number的值

invoke fun,number

invoke exitprocess,0 ;退出程序,返回值為0

end start ;指明程式入口點start

本人在此之前已經完成

**如下:

fun proc n:dword

local x:dword,y:dword

mov esi,n ;153

mov x,10

mov ecx,0

.while esi!=0

mov eax,esi

cdqmov esi,eax ;15 1

mov y,edx ;3 5 1

mov eax,y

mul y

mul y

add ecx,eax

.endw

.if ecx==n ;是水仙花數

invoke printf ,addr s1

.else

invoke printf ,addr s2

.endif

retfun endp

於是同學問我 為什麼他的**不對…

**如下:

fun proc x:dword

mov ebx,0

mov ecx,10

mov eax,x

.while eax!=0

cdqdiv ecx

mov edi,eax

mov eax,edx

mul edx

mul edx

add ebx,eax

mov eax,edi

.endw

.if ebx == x

invoke printf,addr fmt2,addr s1

.else

invoke printf,addr fmt2,addr s2

.endif

retfun endp

我找的錯誤是暫存器轉移時內容轉移時出現問題。

下面是我發現問題後的幾個疑問。

希望有大佬幫忙解答:

1.為什麼單純輸出乙個暫存器時內容正常而兩個暫存器內容都輸出時edx的值好像變成了位址?

如下圖:

2.後續的輸出eax值中在第乙個mul edx 還能輸出值來,後面的輸出又變成位址了???

終究還是實力不夠。

invoke printf,addr fmt,eax
至於暫存器錯誤原理不懂得如何解決。但是在同學**的基礎上加了兩個定義的 p,q 來儲存 除數和餘數是可以成功的解決問題的。

**如下:

fun proc x:dword

local p:dword ,q:dword

mov ebx,0

mov ecx,10

mov eax,x

.while eax != 0

cdqdiv ecx

mov p,eax

mov q,edx

mov eax,q

mul q

mul q

add ebx,eax

mov eax,p

.endw

.if ebx == x

invoke printf,addr fmt2,addr s1

.else

invoke printf,addr fmt2,addr s2

.endif

retfun endp

檢視其它大佬解題**:

.386				;選擇的處理器

.model flat, stdcall ;儲存模型,win32程式只能用平展(flat)模型

option casemap:none ;指明識別符號大小寫敏感

include kernel32.inc ;要引用的標頭檔案

includelib kernel32.lib ;要引用的庫檔案

includelib msvcrt.lib ;引用c庫檔案

scanf proto c:dword,:vararg ;c語言scanf函式原型宣告

printf proto c:dword,:vararg ;c語言printf函式原型宣告

.data ;⑤資料段

fmt byte '%d',0 ;定義變數

fmt2 byte '%s',0 ;定義變數

n dword 0

s1 byte '是水仙花數',0

s2 byte '不是水仙花數',0

.code ;⑥**段

;*【*/

fun proc x:dword

mov ebx,0

mov ecx,10

mov eax,x

.while eax!=0

cdqidiv ecx

mov edi,eax

mov eax,edx

imul eax,edx

imul eax,edx

add ebx,eax

mov eax,edi

.endw

.if ebx==x

invoke printf,addr fmt2,addr s1

.else

invoke printf,addr fmt2,addr s2

.endif

retfun endp

;*】*/

start: ;定義標號start

invoke scanf,addr fmt,addr n ;輸入n的值

invoke fun,n

invoke exitprocess,0 ;退出程序,返回值為0

end start ;指明程式入口點start

感覺跟我同學的**相差不大 就是找不出錯誤原因…

小白求解!

水仙花問題

題目 輸出所有的 水仙花數 1.水仙花數是乙個三位數 2.水仙花數的個位 十位 百位的數字立方和等於原數。分析 運用for迴圈遍歷所有的三位數,三位數從100開始,到999結束 for int i 100 i 999 i 取出三位數中的個位十位百位數字 int a 數的個位 int b 數的十位 i...

關於水仙花數

前幾天看到有人去面試,筆試要求寫出列印水仙花數 這裡先解釋下什麼是水仙花數,以153為例,153 1的三次方 5的三次方 3的三次方。也就是所謂的水仙花數是指乙個三位數,其各位數字立方和等於該數本身。那麼,我們先來看 public static void main string args 其中,x ...

關於水仙花數問題 python

這個問題本身並不難,從題目中已經得知判斷的標準是 滿足方程abc a 3 b 3 c 3即可,所以解決問題的關鍵是將乙個三位數的百位,十位,個位的數分離出來,具體的辦法已在 中給出。編寫乙個程式,求 100 999 之間的所有水仙花數。如果乙個 3 位數等於其各位數字的立方和,則稱這個數為水仙花數。...