我不理解JG/JNLE/JL/JNGECMP之后的说明.
例如,如果我有:
CMP al,dl
jg label1
Run Code Online (Sandbox Code Playgroud)
当al=101; dl =200.
我们问jg什么?是al>dl吗?还是al-dl>0?
在下一个代码上相同的prolbem:
test al,dl
jg label1
Run Code Online (Sandbox Code Playgroud)
我不明白我们比较什么,以及我们问什么" jg".
换句话说,我不明白我们何时会跳转到label1,何时不会.
谢谢.
以下是Intel语法中的一些汇编代码:
// Jump to done if rsi >= rax.
cmp rsi, rax
jae done
Run Code Online (Sandbox Code Playgroud)
这对我的大脑有意义:如果rsi"高于或等于"rax,则跳转,匹配指令中参数的顺序cmp.将其与GNU语法进行比较:
// Jump to done if rsi >= rax.
cmp %rax, %rsi
jae done
Run Code Online (Sandbox Code Playgroud)
这每次伤害我的大脑.它没有帮助,当我来到这个新的后一段时间不写汇编代码我去看看的语义cmp
,并jae在Intel手册,发现这一切都在"第一","第二"操作,来表述其与我面前在屏幕上看到的不符.
结束抱怨.我的问题:
有没有其他方式表达cmp或jaeGNU汇编程序,以便操作数的顺序cmp与逻辑比较匹配jae?
假设(1)的答案是否定的,是否有人有一个很好的方式让我看看这个,以便我能记住下次它是如何工作的?还有比"GNU倒退"更好的东西吗?
请注意,我不是要问如何在GNU汇编程序中使用Intel语法; 我知道这是可能的.我正在使用现有的GNU语法代码库,并且正在寻求一些助记符或其他方式来帮助我保持这一点.
我是学习汇编语言的新手,刚刚开始深入研究它,所以我想知道是否有些人可以帮我解决一个问题.我有一个家庭作业,告诉我将汇编语言指令与c代码进行比较,并告诉我哪个c代码等同于汇编指令.所以这是装配说明:
pushl %ebp // What i think is happening here is that we are creating more space for the function.
movl %esp,%ebp // Here i think we are moving the stack pointer to the old base pointer.
movl 8(%ebp),%edx // Here we are taking parameter int a and storing it in %edx
movl 12(%ebp),%eax // Here we are taking parameter int b and storing it in %eax
cmpl %eax,%edx // Here i think we are comparing int a and b …Run Code Online (Sandbox Code Playgroud)