是否可以在x86汇编语言中模拟if-statment(使用masm语法)?我想在x86汇编语言中做这样的事情,但我不确定应该使用哪个运算符来模拟if-ore语句。我应该使用jl
指令,还是cmp
指令,还是其他指令?
int i = 2;
int j = 3;
if(i > j){
i = 1;
}
else{
i = 4;
}
假设有两个部件标签:
cmp j1, j2
jg LABEL1
LABEL2
而且MASM没有“语法”,它就像一个“编译器”,通常称为汇编程序。
汇编是语言,汇编是“编译器”。
你可以查一下你的CPU手册,也可以问编译器
gcc -c foo.c
objdump -d foo.o
Where foo。c只是一个简单方法中的函数。输出为
00000000 <_foo>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub $0x10,%esp
6: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%ebp)
d: c7 45 f8 03 00 00 00 movl $0x3,-0x8(%ebp)
14: 8b 45 fc mov -0x4(%ebp),%eax
17: 3b 45 f8 cmp -0x8(%ebp),%eax
1a: 7e 09 jle 25 <_foo+0x25>
1c: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%ebp)
23: eb 07 jmp 2c <_foo+0x2c>
25: c7 45 fc 04 00 00 00 movl $0x4,-0x4(%ebp)
2c: c9 leave
2d: c3 ret
2e: 90 nop
2f: 90 nop
最开始的工作是设置堆栈/处理调用约定,重要的是
17: 3b 45 f8 cmp -0x8(%ebp),%eax
1a: 7e 09 jle 25 <_foo+0x25>
1c: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%ebp) // i = 1;
23: eb 07 jmp 2c <_foo+0x2c>
25: c7 45 fc 04 00 00 00 movl $0x4,-0x4(%ebp) // i = 4;
在这种情况下,它只是一个cmp
,后跟一个jle
-语句的“if”部分以jmp
结尾,以跳过语句的其他部分。
cmp
和jcc
(即条件跳转)指令的组合就可以了。查找您的CPU手册。
本文向大家介绍Intel x86 Assembly& Microarchitecture x86汇编语言,包括了Intel x86 Assembly& Microarchitecture x86汇编语言的使用技巧和注意事项,需要的朋友参考一下 示例 x86汇编语言家族代表了最初的Intel 8086架构数十年来的进步。除了基于所使用的汇编器的几种方言外,多年来添加了附加的处理器指令,寄存器和其他功
问题内容: 可以从python中的单行方法返回 寻找这样的东西 尝试过,并且语法无效 我可以轻松做到: 但只是好奇我是否可以将上述if语句合并为一行 问题答案: 可以在一行上编写标准的“ if”语句: 但是pep 8样式指南建议不要这样做: 通常不建议使用复合语句(同一行上有多个语句)
问题内容: 我知道供应商有自己的原始SQL语言子集,这些子集用C(类似于Postgre SQL)或MS-SQL Server(C ++)等编写。 那么,原始的SQL是用C编写的,还是在Assembly中创建的呢?我真的找不到关于其原始语言根源的明确答案(除了历史等) 问题答案: 在Oracle上进行的快速历史搜索得出: 在70年代后期,Ingres刚开始在加州大学伯克利分校工作时,三个从事CIA合
想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。 这是我的if语句。我只想写得更短。因为我认为这些是无效的。顺便说一句,每个if语句都是独立的。
机器语言 机器语言是指令的集合。 汇编语言 汇编语言的主体是汇编指令。 存储器 随机存储器RAM,可读可写,必须带电存储,关机后存储的内容丢失 只读存储器ROM,只读,关机后其中的内容不丢失 装有 BIOS (基本输入输出设备)的ROM 接口卡上的RAM:显存 外存(storage,磁盘)和内存(memory,主存,高速缓存) 内存地址空间 存储单元:1个字节(byte) 总线 地址总线:CPU是
我很难理解由一个简单的C程序的gcc创建的汇编语言输出。 以下是该程序的C代码: 下面是gcc创建的汇编代码: 我很难理解汇编代码中某些指令的操作数顺序(参考内存布局,请参阅内存布局图)。首先,有指令 它将调用方的基指针推送到堆栈上。这条指令之后是下面的指令: 此指令应将被调用方的基指针设置为当前堆栈指针的值。但是,两个操作数的顺序是否应该相反(例如,movq%rbp,%rsp)? 类似的“问题”