找回密码
 欢迎注册
楼主: liangbch

[擂台] 求一个无符号整数的10进制位数

[复制链接]
 楼主| 发表于 2009-2-6 16:20:17 | 显示全部楼层
哈哈,学了一招。 不过,你的代码在我的VC6.0有有点问题,首先main函数的定义有问题不能白编译通过,其次将main函数改好后不能运行。稍加修改后,终于能运行了,主要修改是将 "mov edx, jmpTable" 改为 "mov edx, offset jmpTable",.下面是修改后的代码。
  1. int JmpTest(void)
  2. {
  3. __asm
  4. {
  5. mov eax, 1
  6. mov edx, offset jmpTable
  7. mov ecx, 4
  8. add edx, ecx
  9. jmp edx
  10. jmpTable:
  11. jmp jmp1
  12. jmp jmp2
  13. jmp jmp3
  14. jmp1:
  15. mov ecx, 2
  16. jmp exit1
  17. jmp2:
  18. mov ecx, 3
  19. jmp exit1
  20. jmp3:
  21. mov ecx, 4
  22. jmp exit1
  23. exit1:
  24. mov eax, ecx
  25. }
  26. }
  27. void main()
  28. {
  29. int a=JmpTest();
  30. printf("a=%d",a);
  31. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-6 16:27:16 | 显示全部楼层
VC2008, 真正的跳转表, 也可编译,可执行 但现在问题是当前的标号都是短标号(偏移在-128 -- 127内) 所以jmp表指令都是2字节的 不知道,长汇编是否有差异
确实,短的跳转表不太方便,稍微复杂点的程序就不能用了。我将jmp 后加上NEAR关键字,仍然不起作用。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-6 16:43:49 | 显示全部楼层
这种用法相对于在汇编源文件的实现跳表有一个缺点,就是不得不使用2次跳转。无心人能做一个只需要一次跳转指令的实现吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-6 16:48:53 | 显示全部楼层
我喜欢写内嵌汇编,但跳转表还没写过,向你们学习。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-6 17:04:23 | 显示全部楼层
呵呵 我一开始是有offset的, 似乎又没有都么关系 因为,错误的把edx写成ebx,结果调试不通过,结果去掉了 如果实现直接jmp,必须预先把jmp地址保存在一个表里 而jmp地址的标号是编译时才确定的 所以是有点困难的 但,似乎我们可以用nop 对齐,使得每个jmp后的代码块一样大小 当然,最好是2,4,8,16,32等大小!!!! 这样子,就不需要预先保存了,只要有第一个地址 下面的可以计算得到 这种方式就需要有能精确测定代码的指令长度的方法了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-6 17:05:23 | 显示全部楼层
To: GxQ 这个也是我第一次
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-6 17:07:52 | 显示全部楼层
另外, jmp的指令是否是短格式,仅和标号的相对偏移有关系 加上也不一定是,不加系统会自动判定 但长格式,不知道有否编译指令能强制是长格式
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-6 17:11:14 | 显示全部楼层
具体到楼主这个例子 我想能利用8字节指令长度对齐得到C内嵌入汇编的一个代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-6 18:56:56 | 显示全部楼层
vc下要用跳转表还是比较麻烦的.这一点还是gcc比较号,直接可以用c语言写.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-6 21:12:32 | 显示全部楼层
肚子讲详细些 不过gcc写汇编麻烦多了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-24 10:10 , Processed in 0.027032 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表