当前位置: 首页 > 知识库问答 >
问题:

是否可以用x86汇编语言编写if语句?

石正信
2023-03-14

是否可以在x86汇编语言中模拟if-statment(使用masm语法)?我想在x86汇编语言中做这样的事情,但我不确定应该使用哪个运算符来模拟if-ore语句。我应该使用jl指令,还是cmp指令,还是其他指令?

int i = 2;
int j = 3;
if(i > j){
    i = 1;
}
else{
    i = 4;
}

共有3个答案

卫俊力
2023-03-14

假设有两个部件标签:

cmp j1, j2
jg LABEL1
LABEL2

而且MASM没有“语法”,它就像一个“编译器”,通常称为汇编程序。

汇编是语言,汇编是“编译器”。

诸嘉澍
2023-03-14

你可以查一下你的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结尾,以跳过语句的其他部分。

丌官信厚
2023-03-14

cmpjcc(即条件跳转)指令的组合就可以了。查找您的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)? 类似的“问题”