[英]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.