【发布时间】:2017-07-05 15:18:16
【问题描述】:
我正在学习 MASM,但无法让这个简单的代码工作。我没有得到传递给调用的值,我不知道发生了什么。我试过推 2,推 2,叫 pow。结果相同。 EAX 和 EDX 看起来像垃圾或者内存地址。
线程 0x1544 已退出,代码为 -1073741510 (0xc000013a)。 线程 0xd8 已退出,代码为 -1073741510 (0xc000013a)。 线程 0x898 已退出,代码为 -1073741510 (0xc000013a)。 线程 0x21c4 已退出,代码为 -1073741510 (0xc000013a)。 程序“[2296] AssemblyTutorial.exe”已退出,代码为 -1073741510 (0xc000013a)。
这只是意味着我关闭了控制台窗口,但是为什么有 4 个线程?
.386
.model flat,stdcall
option casemap:none
include windows.inc
include masm32.inc
includelib masm32.lib
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
.code
;requires power > 0 for correct answers
pow proc x:DWORD, power:DWORD
;THESE TWO MOVES RIGHT HERE ARE NOT WORKING AS EXPECTED
;I PUSH 2 ONTO STACK BUT WHEN I LOOK AT REGISTER VALUES
;IN DEBUG THEY ARE INCORRECT/GARBAGE
mov eax, x ;eax has x
mov edx, power ;edx has power
mov ecx, eax ;ecx will be my constant base
start_power:
cmp edx, 1 ;is power 1?
je end_power ;then jump to end
imul eax, ecx ;else mul result/x with x
dec edx ;power--
jmp start_power ;jump back to beginning of loop
end_power:
ret ;return answer eax
pow endp
start:
invoke pow, 2, 2 ;eax should hold 4 after this
invoke ExitProcess, eax ;program should exit with code eax, ez way to print result
end start
【问题讨论】:
-
我必须自己用stdcall管理堆栈指针和基指针吗?我的印象是 masm proc 会为你做到这一点。
-
您可以编辑自己的帖子,而不是添加 cmets 来详细说明您的问题。
-
IMUL 总是将结果放入 EDX?我也不明白 EDX:EAX 是什么意思。像这样在中间加一个冒号是什么意思?
-
"IMUL指令的三种形式的相似之处在于乘积的长度被计算为操作数长度的两倍。使用单操作数形式,乘积被准确地存储在目标中. 然而,对于二和三操作数形式,结果在存储到目标寄存器之前会被截断到目标的长度。由于这种截断,应测试 CF 或 OF 标志以确保没有显着位丢失。”所以结果将被截断而不跨越多个寄存器。结果将在 EAX 中。没有?
-
您的权利。道歉。我的假设是错误的。