请个cmp的简单问题!

美伊小公主的奶爸 2009-04-16 02:46:11


我的c代码如下:
int main()
{

int a = -1;
if(a == -1)
{
printf("a");
}
return 1;
}

在vc6下对应的反汇编代码为:

8: int a = -1;
00401028 mov dword ptr [ebp-4],0FFFFFFFFh
9: if(-1 == a)
0040102F cmp dword ptr [ebp-4],0FFh
00401033 jne main+41h (00401051)

cmp那句比较的明明是0xFFFFFFFF与0FFh,可是为什么结果相等呢?望大家赐教!!!!!!
...全文
197 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
太谢谢啦!!!!!!
zara 2009-04-16
  • 打赏
  • 举报
回复
指令逻辑上是这样的. 很多指令都有类似的情况, 比如算术运算, 立即数压栈等等. 有兴趣再详细地看看的话, 可以去下载 intel 的较新版本 cpu 的指令集来看看.

[Quote=引用 9 楼 cymvp 的回复:]
大虾的意思是不是就是说,实际上“cmp eax,0FFh ”这条指令,会对0ffh先进行一次符号扩展,再进行cmp运算?也就是传统的movsx和cmp两条指令的合集?[/Quote]
  • 打赏
  • 举报
回复
大虾的意思是不是就是说,实际上“cmp eax,0FFh ”这条指令,会对0ffh先进行一次符号扩展,再进行cmp运算?也就是传统的movsx和cmp两条指令的合集?

[Quote=引用 8 楼 zara 的回复:]
这个, 只是比较新的 cpu 指令而已.
机器码 指令
83 /7 imm8 cmp r/m32, imm8
即将寄存器/内存单元和8位立即数进行比较. 8 位立即数为符号数进行扩展.
设计该指令, 应该是在可能的情况下, 减少指令长度. 因为这时占用了 3 个字节. 如果使用完整的 4 字节 dword 的话, 至少需要 5 个字节了:
3D id cmp eax, imm32 ; 操作码 3D 一个字节, 4 字节的立即数
如果是内存变量的话, 还会再多一字节作为 M…
[/Quote]
zara 2009-04-16
  • 打赏
  • 举报
回复
这个, 只是比较新的 cpu 指令而已.
机器码 指令
83 /7 imm8 cmp r/m32, imm8
即将寄存器/内存单元和8位立即数进行比较. 8 位立即数为符号数进行扩展.
设计该指令, 应该是在可能的情况下, 减少指令长度. 因为这时占用了 3 个字节. 如果使用完整的 4 字节 dword 的话, 至少需要 5 个字节了:
3D id cmp eax, imm32 ; 操作码 3D 一个字节, 4 字节的立即数
如果是内存变量的话, 还会再多一字节作为 ModR/M 域
  • 打赏
  • 举报
回复
你标的红字是我后来写帖子的时候改过来的,跟结果没什么关系,我把代码重新贴一遍:
#include "stdio.h"

int main()
{
unsigned char a = -1;
if(a == -1)
{
printf("a");
}
return 1;
}
反汇编如下:
5: unsigned char a = -1;
00401028 mov byte ptr [ebp-4],0FFh
6: if(a == -1)
0040102C mov eax,dword ptr [ebp-4]
0040102F and eax,0FFh
00401034 cmp eax,0FFh
00401037 jne main+36h (00401046)
这次改为unsigned char a = -1 ;但是可以看到00401034 cmp eax,0FFh还是用的0ffh!
请赐教!
xtdumpling 2009-04-16
  • 打赏
  • 举报
回复
[引用楼主 cymvp 的帖子:]


  我的c代码如下:
  int main()
{

int a = -1;
if(a == -1)
{
printf("a");
}
return 1;
}

在vc6下对应的反汇编代码为:

8:        int a = -1;
00401028  mov        dword ptr [ebp-4],0FFFFFFFFh
9:      if(-1 == a)
0040102F  cmp        dword ptr [ebp-4],0FFh
00401033  jne        main+41h (00401051)

vs 2005,
没有vc 6,我猜你应该是反汇编错了,
  • 打赏
  • 举报
回复
楼上这个是用的什么编译器?我的是vc6.0,楼上这个才解释得通阿
xtdumpling 2009-04-16
  • 打赏
  • 举报
回复
我反汇编是:
     9: int a = -1; 
004113BE mov dword ptr [a],0FFFFFFFFh
10: if(a == -1)
004113C5 cmp dword ptr [a],0FFFFFFFFh
004113C9 jne main+42h (4113E2h)
  • 打赏
  • 举报
回复
这个问题很难么?我想了一上午,现在很着急!望各位赐教!!!!!!
  • 打赏
  • 举报
回复
结果执行了printf("a"); 这句,也就是说cmp的比较结果是je阿
BAYNPU 2009-04-16
  • 打赏
  • 举报
回复
00401033 jne main+41h (00401051) ;这个语句是相等吗?
内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。

21,500

社区成员

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

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