MASM汇编 - 为什么这段代码仍然会跳转?

dar*_*ius 0 x86 assembly masm

基本上我试图提示用户输入一个整数并测试它是否是无符号的.如果它是无符号的,我想移动到无符号块并获得另一个用户输入.如果签名,那么基本上什么也不做,结束程序.

mov edx, OFFSET prompt1  
call writeString         
call readDec  
test eax, eax  
jns unsigned


unsigned:  
    mov edx, OFFSET prompt2   
    call writeString    
    call readDec

END main
Run Code Online (Sandbox Code Playgroud)

但是,即使我输入一个无符号整数(如-5),它仍会进入无符号块并运行块中的代码.为什么它仍然会跳转,即使eax中的输入已经签名,如果没有签名我正在使用跳转?

Ros*_*dge 5

当EAX没有设置符号位时,jns unsigned指令跳转到unsigned标签并在那里执行指令.当EAX设置了符号位时,它不会跳转而是执行以下指令.

在这两种情况下都会执行相同的指令:mov edx, OFFSET prompt2.它既是标签上unsigned的指令,也是指令后面的jns unsigned指令.

如果你希望你的程序在EAX为负时结束,那么你需要在jns unsigned导致它结束的指令之后添加一些代码.否则它将继续执行指令.您在代码末尾遇到同样的问题.该END指令只是告诉汇编程序停止汇编代码,它不会阻止程序执行.在第二次call readDec返回后,程序将执行在内存中跟随它的任何指令.