我现在遇到了一个问题。我正在尝试输入一个数字来表示我想要的硬币总数,并在不使用"div“指令的情况下分别显示美元总数和美分总数。这基本上就是我的整个程序:
; Assembler directives
.586 ;accept instructions for 586
.MODEL FLAT ;generate code for flat memory
INCLUDE io.h ;header file for input/output
.STACK 4096 ;reserve 4096-byte stack
.DATA ; Data section begins here: reserve storage for data
numPromptP BYTE "How many pennies do you have?", 0 ;Prompt string for pennies
numPromptN BYTE "How many nickles do you have?", 0 ;Prompt string for nickles
numPromptD BYTE "How many dimes do you have?", 0 ;Prompt string for dimes
numPromptQ BYTE "How many quarters do you have?", 0 ;Prompt string for quarters
asciiInNum BYTE 3 DUP (?) ;ASCII input for an integer
outCoinLabel BYTE "Coin Information", 0 ;string to display total amount of coins
asciiOutCoinString BYTE "Number of coins: ", 10 DUP (?), 0dh, 0ah, "Dollars: ", 10 DUP (?), 0dh, 0ah, "Cents: ", 10 DUP (?), 0
intP DWORD ? ;pennies 32-bit integer
intN DWORD ? ;nickles 32-bit integer
intD DWORD ? ;dimes 32-bit integer
intQ DWORD ? ;quarters 32-bit integer
coinTotal DWORD ? ;Coin Total 32-bit integer
multiplier DWORD ? ;32-bit integer to store value for multiplication
dollarTotal DWORD ? ;32-bit integer to store dollar value of coins
centTotal DWORD ? ;32-bit integer to store cent value of coins
.CODE ; Code section begins here
_MainProc PROC ;main procedure starts here
;read ASCII input for pennies, convert to 2's comp, add to coin total, and store in memory
input numPromptP, asciiInNum, 3 ;prompt for, read, and store ASCII characters
atod asciiInNum ;convert ASCII to 2's comp and store in EAX
mov coinTotal, eax ;move amount of pennies to coinTotal
mov intP, eax ;store pennies value in memory
;read ASCII input for nickles, convert to 2's comp, add to coin total, multiply by 5, and store in memory
input numPromptN, asciiInNum, 3 ;prompt for, read, and store ASCII characters
atod asciiInNum ;convert ASCII to 2's comp and store in EAX
add coinTotal, eax ;add amount of nickles to coinTotal
mov multiplier, 5
mul multiplier ;multiply value in EAX by 5
mov intN, eax ;store nickles value in memory
;read ASCII input for dimes, convert to 2's comp, add to coin total, multiply by 10, and store in memory
input numPromptD, asciiInNum, 3 ;prompt for, read, and store ASCII characters
atod asciiInNum ;convert ASCII to 2's comp and store in EAX
add coinTotal, eax ;add amount of dimes to coinTotal
mov multiplier, 10
mul multiplier ;multiply value in EAX by 10
mov intD, eax ;store 2's comp in memory
;read ASCII input for quarters, convert to 2's comp, add to coin total, multiply by 25, and store in memory
input numPromptQ, asciiInNum, 3 ;prompt for, read, and store ASCII characters
atod asciiInNum ;convert ASCII to 2's comp and store in EAX
add coinTotal, eax ;add amount of dimes to coinTotal
mov multiplier, 25
mul multiplier ;multiply value in EAX by 25
mov intQ, eax ;store 2's comp in memory
;Add up total dollar amount from coins, and store in memory
mov eax, intP
add eax, intN
add eax, intD
add eax, intQ
mov dollarTotal, eax
mov centTotal, eax
dtoa asciiOutCoinString+16, coinTotal
dtoa asciiOutCoinString+37, dollarTotal
dtoa asciiOutCoinString+56, centTotal
output outCoinLabel, asciiOutCoinString
mov eax, 0 ;exit with return code 0
ret
_MainProc ENDP ;end of main procedure
END ;end of source code 我的问题是。有没有办法获取存储在eax寄存器中的字节,这样我就可以说“获取Eax +5内存位置的字节并存储在"dollarTotal”中“,以及”获取存储在EAX +6和EAX +7内存位置中的字节并存储在"centTotal“中。我读过关于间接寄存器模式的文章,但我不太熟悉它,所以我只需要被指引到正确的方向。我已经有了解决方案,我只是不知道如何实现它!我当前的程序打印(如果我指定4便士、4个一角、4个硬币和4个硬币):
Number of coins: 16
Dollars: 164 (I want this to say "1")
Coins: 164 (I want this to say "64")发布于 2015-03-05 10:07:47
我想出了一个独特的解决方案!基本上,取1/100 * 2^32,将此十进制转换为十六进制,并将此十六进制存储在内存的乘法器中。我可以这样做:
imul multiplier将eax中的美元值乘以1/100*2^32,本质上就是“乘法除法”,并将100的位置存储在edx中,其余的存储在eax中。例如,如果我在乘法前将"164“存储在eax中,并执行此指令。这将导致1被存储在edx中,其余的被存储在eax中。
发布于 2015-03-07 01:52:24
这里有一个分隔美元和美分的解决方案,首先转换tempstring中的美元总数,然后有选择地复制组成美元和美分的字符。
dtoa tempstring, dollarTotal
mov al,[tempstring]
mov [asciiOutCoinString+37], al ;"1"
mov ax,[tempstring+1]
mov [asciiOutCoinString+56], ax ;"64"https://stackoverflow.com/questions/28845541
复制相似问题