数学研发论坛

 找回密码
 欢迎注册
楼主: 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, 2019-12-12 13:28 , Processed in 0.055370 second(s), 14 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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