鱼C论坛

 找回密码
 立即注册
查看: 3924|回复: 3

WIN32汇编语言 $ 的作用问题

[复制链接]
发表于 2018-10-22 22:37:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
$: 当前程序语句的地址
  1. ; Test10_2.asm
  2. .386
  3. .model flat, stdcall

  4. include    windows.inc
  5. include    kernel32.inc
  6. include    masm32.inc
  7. include    debug.inc
  8. includelib kernel32.lib
  9. includelib masm32.lib
  10. includelib debug.lib

  11. .data
  12.     V1 db 11,22,33,44
  13.     V1Size = ($ - V1)  ;这是变量 V1 的大小
  14.    
  15.     V2 dw 11,22,33,44
  16.     V2Size = $ - V2    ;这是变量 V2 的大小
  17.    
  18.     V3 dd 10 dup(0)
  19.     V3Size = $ - V3      ;这是变量 V3 的大小
  20.     V3Len  = ($-V3) / 4  ;这是变量 V3(dword 类型数组)的元素数目
  21.    
  22.     V4 db 'abcdefghijklmnopqrstuvwxyz', 0
  23.     V4Size = $ - V4      ;这是变量 V4 的大小
  24. .code
  25. main proc
  26.     PrintHex $        ;00401001, 这是当前语句的地址
  27.     PrintDec V1Size   ;4
  28.     PrintDec V2Size   ;8
  29.     PrintDec V3Size   ;40
  30.     PrintDec V3Len    ;10
  31.     PrintDec V4Size   ;27
  32.     PrintHex $        ;0040135A, 这是当前语句的地址
  33.     ret
  34. main endp
  35. end main
复制代码



如代码所示,代码运行没有问题  疑问在 V3Size = $ - V3   V3Len  = ($-V3) / 4  第二句的$应该包含了V3size这个变量  我觉得应该是V3Len  = ($-V3Size) / 4  但是改了编译就通不过 不知道什么原因!求教大神讲解!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-10-23 00:06:12 | 显示全部楼层
本帖最后由 jackz007 于 2018-10-23 00:29 编辑

        21、22 行是表达式赋值伪操作,不会产生汇编指令,所以,变量 V3Size 和 V3Len 本身的值只取决于赋值语句,而与内存偏移无干。单就内存位置而言,21、22 行中的 $ 是完全相等的。所谓第 22 行的 $ 应该包含 V3Size 的理解是完全错误的。如果一定要改,第 22 行改可以改写为:

  1. V3Len = V3Size / 4
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-23 08:32:15 | 显示全部楼层
jackz007 发表于 2018-10-23 00:06
21、22 行是表达式赋值伪操作,不会产生汇编指令,所以,变量 V3Size 和 V3Len 本身的值只取决于赋 ...

我还是有疑问   .data是放置初始化变量的地方,21 22行由编译器计算后初始化V3Size,和V3Len,那显然V3Size,和V3Len的地址是紧接在V3后面的,还是我理解的有错误啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-23 12:20:02 | 显示全部楼层
本帖最后由 jackz007 于 2018-10-23 13:15 编辑

       在 .data 中,只有 V1、V2、V3、V4 四个变量会产生字节开销,所以,它们各自对应的内存偏移是不同的,也就是说,它们各自对应的 $ (变量)值是不相等的。

       V3Size 和 V3Len 如果不被赋值,它们的值当然等于各自的内存偏移,如今它们已经被赋值了,那就不能直接作为内存偏移值来使用了。

       由于 V3Size 在 21 行已经被赋值为 $ - V3,已经不再等于其位置处的内存偏移,所以,如果把 22 行写成

V3Len  = ($ - V3Size)  /  4

       便是错误的!

       第 22 行采用以下任何一种写法都是正确的

V3Len  = ($ - V3)  /  4

V3Len  = V3Size  /  4

       需要强调的是,由于变量 V3Size 和 V3Len 不会产生字节开销,所以,第 21、22 、24 行的 $ 值是完全相等的,也就是说,如果不被赋值,V3Size 、 V3Len 甚至和后面 V4 的值都是相等的。
        
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 09:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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