在比较语句中使用单个字符 - 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],D5
,STRING
是存储为变量的字符串,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
我有这段 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],D5
,STRING
是存储为变量的字符串,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