关于汇编比较、跳转的问题

_shuo 2017-10-17 03:53:38
请问为何这里明明ecx小于n,但依然会直接跳转到$2
mov ecx, DWORD PTR i
cmp ecx, DWORD PTR n
invoke crt_printf, SADD("here ecx(i): %d",13,10), ecx
invoke crt_printf, SADD("here n: %d",13,10), n
jg $2

完整代码如下
    .486 
.model flat, stdcall
option casemap :none

include \masm32\macros\macros.asm

include \masm32\include\msvcrt.inc
includelib \masm32\lib\msvcrt.lib

main PROTO
WaitKeyCrt PROTO
.data
newline BYTE 13, 10, 0
n DWORD ?
f DWORD ?
i DWORD ?
.code

start:

invoke main
invoke WaitKeyCrt
invoke crt__exit, 0

main PROC uses edi

invoke crt_printf, SADD("Please input a number: ")
invoke crt_scanf, SADD("%d",0), addr n
invoke crt_printf, SADD("n: %d",13,10), n
; Line 7
mov DWORD PTR i,2
; Line 8
mov DWORD PTR f,1

$1:
; Line 9
mov ecx, DWORD PTR i
cmp ecx, DWORD PTR n
invoke crt_printf, SADD("here ecx(i): %d",13,10), ecx
invoke crt_printf, SADD("here n: %d",13,10), n
jg $2
; Line 10
mov edx,f
imul edx,i
mov f,edx
; Line 11
mov eax,i
add eax,1
mov i,eax
; Line 12
jmp $1
$2:
invoke crt_printf, SADD("Result: %d",13,10), n
ret
main ENDP

WaitKeyCrt PROC
invoke crt_printf, SADD(13,10,"Press any key to continue...")
invoke crt__getch
.if (eax == 0) || (eax == 0E0h)
invoke crt__getch
.endif
invoke crt_printf, OFFSET newline
ret
WaitKeyCrt ENDP

END start
...全文
1093 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
_shuo 2017-10-19
  • 打赏
  • 举报
回复
感谢大家帮助,就是invoke的问题,把cmp那里的invoke注释掉就好,保护寄存器状态很重要!
zara 2017-10-18
  • 打赏
  • 举报
回复
不知道你是怎么确定没有跳转的。你用的 jg 是符号数的比较,对 c/c++ 的 int 类型是这样的,如果输入的 n 是 4 这样的,没有了那些debug 的显示是看不到效果的,除非最后再输出 i 来看下;我删除了那几行,最后加上输出 i 的,发现 i 是增加了到 n+1 的,说明 jg 是正常的没有跳走,只有输入 n=1 时才会立即跳走。
另外,如果采用了那几行 debug 用,应该用 pushfd-popfd 指令对,否则可能会生成 pushfw-popfw 而导致堆栈 esp 不能对齐到 dword,进而 cprintf() 不能正常输出。
zara 2017-10-17
  • 打赏
  • 举报
回复
cmp 和 Jcc 指令间还有 cprintf() 函数调用?这个可能会破坏原来的 CF 的吧,要么 cmp 在 cprintf() 之后,要么 cprintf() 前 pushf 然后 popf 再 Jcc
_shuo 2017-10-17
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
cmp 和 Jcc 指令间还有 cprintf() 函数调用?这个可能会破坏原来的 CF 的吧,要么 cmp 在 cprintf() 之后,要么 cprintf() 前 pushf 然后 popf 再 Jcc
确实有这个问题,多谢提醒。但那段是因为跳转有问题所以用来debug的,去掉后依然不能正常跳转,还望大大肯继续赐教

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧