You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编字符串循环作业中esi、edi指针及寄存器值跟踪问题求助

汇编课程作业错误修正指南

本次作业对应汇编代码

; 传入2个参数
; string1 为 "ghost",存储在地址1000h,传入ESI寄存器
; string2 为 "ghostly",存储在地址2000h,传入EDI寄存器
; 注:C风格字符串以0作为结束标识

_Task1  proc
_asm
    Mov     bx,0        ; 初始化返回结果为0,默认表示比较失败
    mov esi, DWORD PTR [esp + 4]    ; 从栈中读取第一个参数,即第一个字符串的起始地址
    mov edi, DWORD PTR [esp + 8]    ; 从栈中读取第二个参数,即第二个字符串的起始地址
                    ; 对应寄存器:esi、edi、al、ah
L1:
    mov al, [esi]       ; 取esi指向的内存字符存入al
    mov ah, [edi]       ; 取edi指向的内存字符存入ah
    cmp al, 0           ; 判断第一个字符串是否读取到结束符
    jne L2              
    cmp ah, 0           ; 第一个字符串结束时,判断第二个字符串是否也结束
    jne L2              
    mov     bx,1        ; 两个字符串同时结束,标记为相等,返回值设为1
    jmp L3              
L2:                     
    inc esi             ; esi地址+1,指向第一个字符串的下一个字符
    inc edi             ; edi地址+1,指向第二个字符串的下一个字符
    cmp al, ah          ; 比较本次取出的两个字符是否相等
    je  L1              ; 字符相等则跳回L1,继续下一轮比较
L3:                     
    Ret                 ; 函数返回,bx寄存器存储返回结果
_Task1  endp
End

核心错误梳理

你之前的理解存在两处严重偏差:

  • 你提到的「EAX、ECX置零、循环累加存入Total变量」的逻辑和本次_Task1代码完全无关,这段代码的功能是比较两个输入C风格字符串是否完全相等,你混淆了不同作业题的逻辑,这是首先要修正的核心问题。
  • 你混淆了寄存器的存储内容:esi和edi是地址寄存器,存储的是内存单元的地址,不是地址里存储的字符值。题目明确说明两个字符串的起始地址是1000h和2000h,因此esi初始值是1000h,edi初始值是2000h,你之前表格里填的g/h是[esi]/[edi]寻址取到的字符值,不是esi/edi本身的值,这就是老师打零分的直接原因。

代码逻辑完整解读

该函数的作用是判断传入的两个C风格字符串是否完全相等,返回值存在bx寄存器中,相等返回1,不相等返回0,本题给定的两个字符串场景下,"ghost"长度为5,"ghostly"长度为7,最终会因为第一个字符串结束时第二个字符串还有剩余字符,返回0,判定为不相等。

填表修正说明

你只改esi、edi列的字符完全无法解决问题,需要按照寄存器实际存储内容全部重填:

  • esi列永远填地址值:初始为1000h,每执行一次inc esi就加1,依次为1001h、1002h、1003h、1004h、1005h
  • edi列永远填地址值:初始为2000h,每执行一次inc edi就加1,依次为2001h、2002h、2003h、2004h、2005h、2006h
  • al列填[esi]取出的字符:依次为'g'、'h'、'o'、's'、't'、0
  • ah列填[edi]取出的字符:依次为'g'、'h'、'o'、's'、't'、'l'、'y'、0

内容的提问来源于stack exchange,提问作者JulianTheProgrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:24:04