鱼C论坛

 找回密码
 立即注册
查看: 3718|回复: 7

[已解决]求助!!数组逆序传送到另一数组

[复制链接]
发表于 2020-12-15 11:32:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:要求在数据段中定义的数组ARY逆序传送到另一数组DEST。
最佳答案
2020-12-15 13:59:55
assume ds:data,cs:code
data segment
      ARY        DW  12345,54321,9999,7654,8888,4728,8341,9527,123,32167
          DEST        DW  10 DUP(0)
data ends
code segment
start:
        MOV AX,DATA
        MOV DS,AX
        MOV ES,AX
        
        ;传10个数
        MOV CX,10
        DEC CX
        SHL CX,1
        ;设置源数据地址
        LEA SI,ARY
        ADD SI,CX
        ;设置目的数地址
        LEA DI,DEST
        SHR CX,1
        INC CX
_@1:
        MOV AX,WORD PTR [SI]
        MOV WORD PTR [DI],AX
        SUB SI,2
        ADD DI,2
        LOOP _@1
        MOV AX,4C00H
        INT 21H
code ends
end start
未命名.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-15 12:12:07 | 显示全部楼层
// 要求在数据段中定义的数组ARY逆序传送到另一数组DEST
#include <stdio.h>

int main()
{
        int i, j = 0, k = 0, ARY[20] = { 0 }, DEST[20] = { 0 };
        for (i = 0;i < 10;i++)
        {
                scanf("%d", &ARY[i]);
                j++;
        }
        
        k = j - 1;
        for (i = 0;i < j;i++)
        {
                DEST[k] = ARY[i];
            k--;
    }

        for(i = 0;i < j;i++)
            printf("%d ", DEST[i]);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-15 12:14:08 | 显示全部楼层

能用汇编语言表示出来吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-15 12:47:22 | 显示全部楼层
我还可以学 发表于 2020-12-15 12:14
能用汇编语言表示出来吗

#include <stdio.h>

int main()
{
00B051A0  push        ebp  
00B051A1  mov         ebp,esp  
00B051A3  sub         esp,198h  
00B051A9  push        ebx  
00B051AA  push        esi  
00B051AB  push        edi  
00B051AC  lea         edi,[ebp-198h]  
00B051B2  mov         ecx,66h  
00B051B7  mov         eax,0CCCCCCCCh  
00B051BC  rep stos    dword ptr es:[edi]  
00B051BE  mov         eax,dword ptr [__security_cookie (0B09004h)]  
00B051C3  xor         eax,ebp  
00B051C5  mov         dword ptr [ebp-4],eax  
        int i, j = 0, k = 0, ARY[20] = { 0 }, DEST[20] = { 0 };
00B051C8  mov         dword ptr [j],0  
00B051CF  mov         dword ptr [k],0  
00B051D6  mov         dword ptr [ARY],0  
00B051DD  push        4Ch  
00B051DF  push        0  
00B051E1  lea         eax,[ebp-78h]  
00B051E4  push        eax  
00B051E5  call        _memset (0B010B4h)  
00B051EA  add         esp,0Ch  
00B051ED  mov         dword ptr [DEST],0  
00B051F7  push        4Ch  
00B051F9  push        0  
00B051FB  lea         eax,[ebp-0D0h]  
00B05201  push        eax  
00B05202  call        _memset (0B010B4h)  
00B05207  add         esp,0Ch  
        for (i = 0;i < 10;i++)
00B0520A  mov         dword ptr [i],0  
00B05211  jmp         main+7Ch (0B0521Ch)  
00B05213  mov         eax,dword ptr [i]  
00B05216  add         eax,1  
00B05219  mov         dword ptr [i],eax  
00B0521C  cmp         dword ptr [i],0Ah  
00B05220  jge         main+0A2h (0B05242h)  
        {
                scanf("%d", &ARY[i]);
00B05222  mov         eax,dword ptr [i]  
00B05225  lea         ecx,ARY[eax*4]  
00B05229  push        ecx  
00B0522A  push        offset string "%d" (0B06BF8h)  
00B0522F  call        _scanf (0B013CFh)  
00B05234  add         esp,8  
                j++;
00B05237  mov         eax,dword ptr [j]  
00B0523A  add         eax,1  
00B0523D  mov         dword ptr [j],eax  
        }
00B05240  jmp         main+73h (0B05213h)  
       
        k = j - 1;
00B05242  mov         eax,dword ptr [j]  
00B05245  sub         eax,1  
00B05248  mov         dword ptr [k],eax  
        for (i = 0;i < j;i++)
00B0524B  mov         dword ptr [i],0  
00B05252  jmp         main+0BDh (0B0525Dh)  
00B05254  mov         eax,dword ptr [i]  
00B05257  add         eax,1  
00B0525A  mov         dword ptr [i],eax  
00B0525D  mov         eax,dword ptr [i]  
00B05260  cmp         eax,dword ptr [j]  
00B05263  jge         main+0E1h (0B05281h)  
        {
                DEST[k] = ARY[i];
00B05265  mov         eax,dword ptr [k]  
00B05268  mov         ecx,dword ptr [i]  
00B0526B  mov         edx,dword ptr ARY[ecx*4]  
00B0526F  mov         dword ptr DEST[eax*4],edx  
            k--;
00B05276  mov         eax,dword ptr [k]  
00B05279  sub         eax,1  
00B0527C  mov         dword ptr [k],eax  
    }
00B0527F  jmp         main+0B4h (0B05254h)  

        for(i = 0;i < j;i++)
00B05281  mov         dword ptr [i],0  
00B05288  jmp         main+0F3h (0B05293h)  
00B0528A  mov         eax,dword ptr [i]  
00B0528D  add         eax,1  
00B05290  mov         dword ptr [i],eax  
00B05293  mov         eax,dword ptr [i]  
00B05296  cmp         eax,dword ptr [j]  
00B05299  jge         main+115h (0B052B5h)  
            printf("%d ", DEST[i]);
00B0529B  mov         eax,dword ptr [i]  
            printf("%d ", DEST[i]);
00B0529E  mov         ecx,dword ptr DEST[eax*4]  
00B052A5  push        ecx  
00B052A6  push        offset string "%d " (0B06B30h)  
00B052AB  call        _printf (0B01316h)  
00B052B0  add         esp,8  
00B052B3  jmp         main+0EAh (0B0528Ah)  
}
00B052B5  xor         eax,eax  
00B052B7  push        edx  
00B052B8  mov         ecx,ebp  
00B052BA  push        eax  
00B052BB  lea         edx,ds:[0B052E8h]  
00B052C1  call        @_RTC_CheckStackVars@8 (0B01253h)  
00B052C6  pop         eax  
00B052C7  pop         edx  
00B052C8  pop         edi  
00B052C9  pop         esi  
00B052CA  pop         ebx  
00B052CB  mov         ecx,dword ptr [ebp-4]  
00B052CE  xor         ecx,ebp  
00B052D0  call        @__security_check_cookie@4 (0B01267h)  
00B052D5  add         esp,198h  
00B052DB  cmp         ebp,esp  
00B052DD  call        __RTC_CheckEsp (0B0110Eh)  
00B052E2  mov         esp,ebp  
00B052E4  pop         ebp  
00B052E5  ret  
00B052E6  xchg        ax,ax  
00B052E8  add         al,byte ptr [eax]  
00B052EA  add         byte ptr [eax],al  
00B052EC  lock push   edx  
00B052EE  mov         al,0  
00B052F0  test        bh,bh  
00B052F2  ?? ??
00B052F3  call        dword ptr [eax]  
00B052F6  add         byte ptr [eax],al  
00B052F8  or          eax,2C00B053h  
00B052FD  ?? ??
00B052FE  ?? ??
00B052FF  call        dword ptr [eax]  
00B05302  add         byte ptr [eax],al  
00B05304  or          byte ptr [ebx-50h],dl  
00B05307  add         byte ptr [ebp+eax*2+53h],al  
00B0530B  push        esp  
00B0530C  add         byte ptr [ecx+52h],al  
00B0530F  pop         ecx  
00B05310  add         ah,cl
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-15 13:24:22 From FishC Mobile | 显示全部楼层
风过无痕1989 发表于 2020-12-15 12:47
#include

int main()

大佬你是直接VC转的呀,我其实是想知道X86汇编写的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-15 13:30:29 | 显示全部楼层
我还可以学 发表于 2020-12-15 13:24
大佬你是直接VC转的呀,我其实是想知道X86汇编写的。。

其实我是看错题了,汇编早就忘记完了,于是就从 VS2015 软件里翻出这段代码,复制给你,你能用就用,不能用,我也没办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-15 13:59:55 | 显示全部楼层    本楼为最佳答案   
assume ds:data,cs:code
data segment
      ARY        DW  12345,54321,9999,7654,8888,4728,8341,9527,123,32167
          DEST        DW  10 DUP(0)
data ends
code segment
start:
        MOV AX,DATA
        MOV DS,AX
        MOV ES,AX
        
        ;传10个数
        MOV CX,10
        DEC CX
        SHL CX,1
        ;设置源数据地址
        LEA SI,ARY
        ADD SI,CX
        ;设置目的数地址
        LEA DI,DEST
        SHR CX,1
        INC CX
_@1:
        MOV AX,WORD PTR [SI]
        MOV WORD PTR [DI],AX
        SUB SI,2
        ADD DI,2
        LOOP _@1
        MOV AX,4C00H
        INT 21H
code ends
end start
未命名.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-15 16:55:43 From FishC Mobile | 显示全部楼层
xieglt 发表于 2020-12-15 13:59

谢谢老哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 19:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表