簡體   English   中英

在比較語句中使用單個字符 - 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。我嘗試CMP.B [STRING, D3],D5 ,其中STRING是存儲為變量的字符串, D3是作為數字的當前索引存儲在一個寄存器中, D5是我在寄存器中與之比較的空白空間,

 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 " (or " CMP.B (0,A4,D3.W),D5 " 如果只使用D3的低 16 位)。

該指令訪問地址A4+D3處的字節,因此如果寄存器A4包含string[0]的地址(這意味着: A4包含指針string!)並且寄存器D3包含值i ,則指令訪問值string[i]

該值將與D5的低 8 位進行比較。

如果string在 PC 相對地址,你可以這樣寫:

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

但通常情況下,將字符串的地址加載到地址寄存器並使用后遞增尋址實際上更有效(這在某種程度上取決於您最終需要的是地址還是第一個匹配字符的索引。

    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM