【发布时间】:2019-06-08 06:41:54
【问题描述】:
我在尝试将 ecx 寄存器保存在堆栈上然后在过程调用中将 ecx 寄存器用于循环时遇到了一些麻烦。我从数字中获得的输出受主程序中的 ecx 约束,而不是程序。问题的本质是在 Masm 中获取字符串,然后使用 ascii 图表表将其更改为数字,然后将这些新数字放入数组中。但是当我从用户那里输入数字时,它会受到主循环的约束,例如,如果我的 ecx 为 3,那么它将只取我输入的前三个数字。首先代码是主要的,然后是两个宏的程序。任何帮助将不胜感激。
我尝试将 ecx 寄存器推入程序内部,然后在程序结束后将其弹出,但这只会弄乱我在主程序中的循环。我还尝试在过程调用开始时使用 pushad 保存所有寄存器,然后在代码末尾使用 popad 将它们全部弹出。那也没用。
.data
prompt1 byte "Welcome to Low level I/O programming , Assignment6.asm, I am your Programmer Jackson Miller :)",0
prompt2 byte "Ths will prompt you for 10 unsigned integears, make sure they can fit into a 32 bit register. After you enter 10 raw ints, I will display the list, sum, and average value",0
prompt3 byte " Please enter a unsigned integear: ",0
prompt4 byte " Invalid Entry",0
input byte 200 dup(0)
list dword 20 dup(0)
num dword ?
temp dword ?
test1 byte "How many times it get here",0
main PROC
push offset prompt1
push offset prompt2
call introduction
mov ecx,10
mov edi, offset list
mov ebx,0
mov edx,0
fillnumbers:
push ecx
push edx
displaystring prompt3
push offset input
call readval
pop edx
mov [edi+edx],eax
add edx,4
pop ecx
loop fillnumbers
mov esi, offset list
mov ecx,10
mov ebx,0
displayints:
mov eax, [esi+ebx]
call writedec
add ebx,4
loop displayints
exit ; exit to operating system
main ENDP
readval PROC
push ebp
mov ebp,esp
retry:
mov edx, [ebp+8]
getstring edx
mov esi,edx
mov ecx,0
check:
lodsb
cmp ax,0
je done
cmp ax,57
jle good
jmp notgood
good:
cmp ax,48
jge doublegood
jmp notgood
doublegood:
sub ax,48
mov ebx,10
xchg eax,ecx
mul ebx
add ecx,eax
mov eax,0
jmp check
notgood:
mov edx,offset prompt4
call writestring
call crlf
mov edx, offset prompt3
call writestring
jmp retry
done:
mov eax,ecx
call writedec
pop ebp
ret 4
readval ENDP
displaystring MACRO input
push edx
mov edx, offset input
call writestring
pop edx
ENDM
getstring MACRO buffer
push edx
mov edx,buffer
call readstring
pop edx
ENDM
【问题讨论】:
-
您说的是
writedec过程,对吧?不幸的是,您没有发布writedec程序... -
首先不要使用
loop,如果您希望ECX 用于循环内的其他内容。使用呼叫保留寄存器。 (在 Irvine32 的调用约定中,所有寄存器都是调用保留的,返回值除外。) -
@PeterCordes 我没有完全理解这个问题:在哪个时刻
ecx没有预期的价值?
标签: assembly x86 masm cpu-registers irvine32