在比较语句中使用单个字符 - Assembly (Motorola 68k)

Use a single character for use in a comparison statement - Assembly (Motorola 68k)

我有这段 C++ 代码,我正试图在汇编 (68K) 中复制它:

int main()
{
    int i=0;
    char *string = "This is a string"
    while(string[i]!=' ')
    {
        /.../
        i++;
    }
    return 0;
}

我卡在了 string[i]!=0,索引程序集部分。我需要 CMP.B 和一个字母 string[i] 以及内存中的一些 ' '。我试过 CMP.B [STRING, D3],D5STRING 是存储为变量的字符串,D3 是当前索引,作为存储在寄存器中的数字,D5 是空的 space 我正在将它与寄存器进行比较,

CMP.B [STRING, D3],D5

这行不通:需要使用地址寄存器,使用寄存器时不能使用32位偏移量。

相反,将 STRING 的地址加载到地址寄存器中 - 例如 A4:

LEA.L (STRING), A4

然后执行CMP.B (0,D3,A4),D5

编辑

我不知道你用的是什么汇编器。使用 GNU 汇编器,指令 CMP.B (0,D3,A4),D5 被写成 CMP.B (0,%D3,%A4),%D5.

刚查了下68000的程序员手册,好像官方的语法是:“CMP.B (0,A4,D3.L),D5”(如果只有D3的低16位,则为“CMP.B (0,A4,D3.W),D5”应使用)。

指令访问地址A4+D3处的字节,所以如果寄存器A4包含string[0]的地址(这意味着:A4包含value of the pointer string!) and the register D3 contains the value i, 指令访问值string[i].

该值将与 D5 的低 8 位进行比较。

如果string在PC-relative地址,你可以这样写:

cmp.b   string(pc,d3.w),d5

但通常情况下,将字符串的地址加载到地址寄存器并使用 post-increment 寻址实际上更有效(这有点取决于您最终需要的是地址还是第一个的索引匹配字符。

    moveq  #' ',d5
    lea    string,a4     ; or string(pc)
loop:
    cmp.b  (a4)+,d5
    bne.s  loop
; now (a4,-1) has the address of the first space character