鱼C论坛

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

VS显示变量数值

[复制链接]
发表于 2023-11-22 09:35:18 | 显示全部楼层 |阅读模式

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

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

x
如图,为何无法计算
  1. .386
  2. .model flat,stdcall
  3. .stack 4096
  4. ExitProcess PROTO,dwExitCode:DWORD

  5. .data
  6. aName BYTE "Abraham Lincoln",0
  7. nameSize= ($-aName)       ;字符串长度



  8. .code
  9. main PROC
  10.         mov ecx, nameSize   ;字符串长度给计数器  ECX = 00000010h=16
  11.         mov esi,0

  12.      L1:  ;把字符压栈
  13.         movzx eax, aName[esi]
  14.         push eax
  15.         inc esi
  16.         loop L1

  17.         
  18.         
  19.     INVOKE ExitProcess,0
  20. main ENDP
  21. END  main
复制代码
11.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-22 09:35:27 | 显示全部楼层
这段代码中的问题在于使用 loop 指令时未正确设置 ecx 寄存器的初始值。 loop 指令会自动将 ecx 寄存器的值减一,并检查其值是否为零,如果不为零则跳转到指定的标签处。但是在这段代码中, ecx 寄存器的初始值是 nameSize ,这个值是字符串长度,可能不会是循环的次数。因此,需要在使用 loop 指令之前,将 ecx 寄存器设置为预期的循环次数。

修正后的代码如下:

  1. .code
  2. main PROC
  3.     mov ecx, nameSize  ; 设置循环次数为字符串长度
  4.     mov esi, 0

  5. L1:
  6.     movzx eax, aName[esi]
  7.     push eax
  8.     inc esi
  9.     loop L1

  10.     INVOKE ExitProcess, 0
  11. main ENDP
  12. END main
复制代码


通过将 ecx 寄存器设置为字符串长度,可以确保 loop 指令会正确执行预期的次数,从而解决计算问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-22 09:37:06 | 显示全部楼层
isdkz 发表于 2023-11-22 09:35
这段代码中的问题在于使用 loop 指令时未正确设置 ecx 寄存器的初始值。 loop 指令会自动将 ecx 寄存器的值 ...

GPTAI没理解我的意思,请亲自看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-22 13:59:49 | 显示全部楼层
nameSize是一个宏常量,没有地址,把取地址符号去掉试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 02:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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