汇编字符串循环作业中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
相关产品推荐
相关产品推荐

