鱼C论坛

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

VS显示变量数值

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

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

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

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

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



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

     L1:  ;把字符压栈
        movzx eax, aName[esi]
        push eax 
        inc esi 
        loop L1

        
        
    INVOKE ExitProcess,0
main ENDP
END  main
11.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

修正后的代码如下:
.code
main PROC
    mov ecx, nameSize  ; 设置循环次数为字符串长度
    mov esi, 0

L1:
    movzx eax, aName[esi]
    push eax
    inc esi
    loop L1

    INVOKE ExitProcess, 0
main ENDP
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-12-22 09:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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