Несколько дней назад я задал вопрос относительно этого кода, поэтому некоторые из вас могут найти его знакомым. Для тех из вас, кто не знаком с этим, что этот код должен делать, это запросить 25 знаковых целых чисел от пользователя и сохранить их в массиве; это делается с помощью подпрограммы requestSignedInts (я уверен, что эта часть работает правильно). Впоследствии подпрограмма «calcMean» должна складывать все значения в массиве, делить их на количество элементов в массиве и затем «обрезать результат до целого числа». Здесь я застрял. Я попытался написать подпрограмму calcMean, которая будет делать то, что я описал только сейчас, но не могу понять, как правильно выполнять деление. Кроме того, я даже не уверен, что то, что я сейчас имею в моей подпрограмме calcMean, будет работать правильно. Может ли кто-нибудь помочь?Сборка новичка, запрашивающая помощь: подписанное целочисленное деление + «обрезание до целого числа»
INCLUDE c:\irvine\irvine32.inc
INCLUDELIB c:\irvine\irvine32.lib
INCLUDELIB c:\masm32\lib\user32.lib
INCLUDELIB c:\masm32\lib\kernel32.lib
.data
theSINTArray BYTE 25 dup(?)
lengthOfArray BYTE ?
indexCounter BYTE 0
prompt BYTE "Please enter a value: ",0
.CODE
main PROC
call requestSignedInts
call calculateMean
exit
main ENDP
requestSignedInts PROC
mov edx, offset theSINTArray
Next:
push edx
mov edx,OFFSET prompt
call WriteString
call ReadInt
pop edx
mov [edx], al
inc edx
cmp edx, offset theSINTArray + 25
jb Next
ret
requestSignedInts ENDP
calculateMean PROC
push ecx
mov ecx,lengthOfArray - theSINTArray ; Determine array length
xor eax, eax ; Clear EAX
mov esi, OFFSET theSINTArray ; Starting point for index into array
calcMean:
movsx edx, byte ptr[esi] ; Sign extended move a byte into EDX
add eax, edx ; Accumulate in EAX
inc esi ; Increment source pointer to the next element
loop calcMean ; or cmp esi,endOfArray/jb, then you wouldn't need to touch ecx
mov ecx,lengthOfArray - theSINTArray ; Determine array length
cdq ; sign-extend eax into edx:eax
idiv ecx ; Divide edx:eax by ecx
; eax now contains the integer and edx contains
; the remainder.
pop ecx
ret
calculateMean ENDP
END main
Отдел уже усекает до целого числа, так что просто ничего не делайте. Кстати, помните о роли 'edx' в разделении. – harold
Команда «idiv» дает целочисленный результат. Как говорит @harold, просто ничего не делайте, результат уже усечен в EAX (http://www.cs.virginia.edu/~evans/cs216/guides/x86.html). –
@harold Если есть «роль» для edx, я, к сожалению, не знаю, что это такое. Я предполагаю, что эта «роль», как ожидается, будет здравым смыслом, но, будучи новичком на этом языке, у меня еще нет всех оснований. Что такое роль edx? – Proto