首页 > 解决方案 > 通过字符串循环遇到指针和跟踪寄存器值的问题

问题描述

这个大会课让我想质疑这个专业。我认为这个任务是正确的,直到她给我发电子邮件“你确实意识到 esi 和 edi 永远不等于 g?他们开始是 1000h 和 2000h。显然你没有注意。没有信用”。

有人可以帮我纠正我做错了什么吗?这是否意味着在前两行和两列中,我有 esi 和 edi 我把 h?如果是这样,就是这样吗?还是还有其他遗漏?她非常挑剔。

这是我所拥有的,就指令而言,她只是希望我们“解码”它,这意味着准确地告诉她这些寄存器中发生了什么。


我们所做的几乎就是将 EAX 和 ECX 设置为零,然后我们进入一个循环。ECX 首先增加 1,然后与 10 进行比较。如果 ECX 小于 10,则将 ECX 添加到 EAX,循环将重复,直到 ECX 大于 10。然后 EAX 的当前值移动到名为Total和的变量中打印总数。

     ; 2 parameters passed
     ; string1  ghost0  ("ghost") AT ADDRESS 1000 (goes into the ESI register)
     ; string2 ghostly0 ("ghostly") AT ADDRESS 2000 (goes into the EDI register)
                ; remember, C++ delineates the end of a string by adding zero

    _Task1  proc
    _asm
         Mov     bx,0        ; set return result to failed
        mov esi, DWORD PTR [esp + 4]    ; this is taking a passed pointer off the stack 
        mov edi, DWORD PTR [esp + 8]    ; this is taking a passed pointer off the stack 
                            esi edi al  ah
    L1:
        mov al, [esi]       g   g   g                    
        mov ah, [edi]       g   g   g   g               
        cmp al, 0           h   g   g   g
        jne L2              h   h   g   g
        cmp ah, 0           h   h   h   g
        jne L2              h   h   h   h
        mov     bx,1        o   h   h   h
        jmp L3              o   o   h   h
    L2:                     o   o   o   h
        inc esi             s   o   o   o
                inc edi     s   o   o   o
        cmp al, ah          s   s   o   o
            je  L1          s   s   s   o
    L3:                     t   s   s   s
            Ret             t   t   s   s
    _Task1  endp            t   t   s   s
            End             t   t   t   t   
Loop1 move the character    0   t   t   t                                       
from esi and edi            0   I   t   t
                            0   I   0   t

Loop1 将 char 从 esi 和 edi 移动到 al 和 ah 寄存器。然后将分配给 al 寄存器的字符与 0 进行比较。如果比较不等于,程序将跳转到 Loop2。Loop2 将 esi 和 edi 递增到下一个字符,并比较 al 和 ah。由于 al 和 ah 相等,程序将跳转到 Loop1。这将重复直到 al 等于 0 程序将终止。

标签: assemblyx86

解决方案


推荐阅读