首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Y86程序集中创建数组循环时出错

在Y86程序集中创建数组循环时出错
EN

Stack Overflow用户
提问于 2014-12-03 19:57:51
回答 1查看 2.7K关注 0票数 0

我需要创建一个程序,将整数数组排序为升序。在C中有足够简单的问题,并给出了代码。

代码语言:javascript
运行
复制
void bubble(int *data, int count)
{
int i, last;
for(last = count‐1; last>0;last‐‐)
{
for(i=0;i<last;i++)
if
(data[i+1] < data[i])
{
/* Swap adjacent elements */
int t=data[i+1];
data[i+1]=data[i];
data[i]=t;
}
}
}

但是当我尝试将它实现到程序集中时,我会得到

代码语言:javascript
运行
复制
Error on line 90: Invalid line
Line 90, Byte 0x00d0: .comm *data,20,4      //data = memory location

或者,如果我评论这一行(我不认为我应该),我就明白了

代码语言:javascript
运行
复制
Error on line 39: Expecting ')'
Line 39, Byte 0x005a:   mrmovl (%edx,%ebx,4),%eax   //%eax = data[i]
Error on line 41: Expecting ')'
Line 41, Byte 0x0066:   mrmovl 4(%edx,%ebx,4),%edi  //%edi = data[i++]
Error on line 46: Expecting ')'
Line 46, Byte 0x0073:   mrmovl 4(%edx,%ebx,4),%edi  //%edi = data[i++]
Error on line 47: Expecting ')'
Line 47, Byte 0x0079:   rmmovl %edi, (%edx,%ebx,4)  //data[i] = data[i++]
Error on line 48: Expecting ')'
Line 48, Byte 0x007f:   rmmovl %eax, 4(%edx,%ebx,4) //data[i++] = data[i]

以下是我的代码:

代码语言:javascript
运行
复制
    .pos 0

init:   irmovl Stack, %esp  //Set up stack pointer
    irmovl Stack, %ebp  //Set up base pointer
    call main       //call main program
    halt            //Terminate program

bubble: pushl %ebp      //setup
    rrmovl %esp, %ebp

    pushl %edx      //declaring *data
    mrmovl 8(%ebp), %edx        
    pushl %ecx      //declaring count
    mrmovl 12(%ebp), %ecx   
    pushl %ebx      //declaring i
    pushl %esi      //declaring last
    pushl %edi
    pushl %eax
    irmovl $1, %edi     //%edi = 1

    rrmovl %ecx,%esi    //last=count
    subl %edi,%esi      //last--

L1: 
    irmovl $0, %edi     //%edi = 0
    subl %edi,%esi      //last -= 0
    jle L9          //ends loop if last <= 0

    irmovl $0, %ebx     //i = 0
L2:
    rrmovl %ebx, %edi   //%edi = copy of i
    subl %esi,%edi      //%edi = i-last
    jge L8          //ends loop if i >= last

    mrmovl (%edx,%ebx,4),%eax   //%eax = data[i]
    irmovl $1, %edi         //%edi = 1
    mrmovl 4(%edx,%ebx,4),%edi  //%edi = data[i++]

    subl %eax,%edi      //%edi = data[i++]-data[i]
    jge L7          //cancel if statement if data[i++]>=data[i]

    mrmovl 4(%edx,%ebx,4),%edi  //%edi = data[i++]
    rmmovl %edi, (%edx,%ebx,4)  //data[i] = data[i++]
    rmmovl %eax, 4(%edx,%ebx,4) //data[i++] = data[i]

L7:
    irmovl $1, %edi     //%edi = 1
    addl %edi,%ebx      //i++
    jmp L2          //go to beginning of loop
L8:
    irmovl $1, %edi     //%edi = 1
    subl %edi,%esi      //last--
    jmp L1
L9:
    popl %ebx       //finish
    popl %esi
    popl %edi
    popl %eax
    popl %ebp

    ret




main:   pushl %ebp      //setup
    rrmovl %esp, %ebp

    pushl %ebx      //declaring *data
    mrmovl data, %ebx   
    pushl %esi      //declaring count
    mrmovl count, %esi  

    rmmovl %ebx, (%esp) //move data to be used by bubble
    rmmovl %esi, 4(%esp)    //move count to be used by bubble

    call bubble

    popl %ebx       //finish
    popl %esi
    popl %ebp

    ret


.comm data,20,4     //data = memory location
.align 4
count:  .long 5     //count = memory location 
data:   .long 2     //data array assignment
    .long 1
    .long 3
    .long 5
    .long 4

.pos 0x200
Stack: .long 0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-03 21:27:26

y86不支持带有索引和缩放的完整x86有效地址语法,它只允许displacement(base)。你必须自己做地址计算。

y86汇编程序也不支持.comm,只需使用.long定义数据

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27280508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档