鱼C论坛

 找回密码
 立即注册
查看: 4799|回复: 16

[已解决]如何建立二维数组,二维数组又是怎样调用的,求助!!!

[复制链接]
发表于 2018-6-15 21:46:56 | 显示全部楼层 |阅读模式

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

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

x
我在百度并没有搜到汇编语言中二维数组的定义与使用!
a db 10 dup (10 dup(0))——>数组是这样定义的吗?,如果是,那它的存储空间是连续,怎么能表示行列呢?
...
mov bx,0
mov si,0
mov al,a[bx][si]->请问这条语句中,bx表示行吗?,si表示列吗?
求解答
感谢!!!!!
最佳答案
2018-6-15 23:23:40
本帖最后由 57158597@qq.com 于 2018-6-17 17:49 编辑

mov al,a[bx][si]这行代码是错误的,什么意思都不代表
二维数组是可以用汇编表示的,就看你怎么理解和应用了
如下:


assume cs:codesg

data segment
   sz db  1,  2,  3,  4, 5,  6, 7,  8,  9,10,11,12,13,14,15,16     ;数组sz的全部内容
      db 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
      db 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
      db 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
data ends  

codesg segment
   start: mov ds,offset sz    ;把数组所在的段地址放入DS
           mov bx,0*16         ;bx=0*16表示1行,1*16第2行,2*16第3行(这个0*16的表达是不对的,我这样写是方便看)
           mov si,0            ;s=0标识第1列,si=1标识第2列以此类推
           mov ax,[bx][si]      ;这里的ax=1,1行1列的位置是1(也可以这么写mov ax,[bx+si]  )
           mov bx,2*16
           mov si,5
           mov ax,[bx][si]     ;这里的ax=38,3行6列的位置                  
                  
           mov ax,4c00h      
           int 21h
codesg ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-15 22:37:16 | 显示全部楼层
汇编语言是低级语言,在汇编语言中貌似没有二维数组的概念
C语言中的二维数组到汇编语言以后就成这样了
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int arr[3][4];
  5.         for(int i = 0; i < 3; ++i)
  6.         {
  7.                 for(int j = 0; j < 4; ++j)
  8.                 {
  9.                         arr[i][j] = 0;
  10.                 }
  11.         }

  12.         return 0;
  13. }
复制代码

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4. 00E4F0D0  push        ebp  
  5. 00E4F0D1  mov         ebp,esp  
  6. 00E4F0D3  sub         esp,114h  
  7. 00E4F0D9  push        ebx  
  8. 00E4F0DA  push        esi  
  9. 00E4F0DB  push        edi  
  10. 00E4F0DC  lea         edi,[ebp-114h]  
  11. 00E4F0E2  mov         ecx,45h  
  12. 00E4F0E7  mov         eax,0CCCCCCCCh  
  13. 00E4F0EC  rep stos    dword ptr es:[edi]  
  14. 00E4F0EE  mov         eax,dword ptr [__security_cookie (0F07000h)]  
  15. 00E4F0F3  xor         eax,ebp  
  16. 00E4F0F5  mov         dword ptr [ebp-4],eax  
  17.         int arr[3][4];
  18.         for(int i = 0; i < 3; ++i)
  19. 00E4F0F8  mov         dword ptr [ebp-44h],0  
  20. 00E4F0FF  jmp         main+3Ah (0E4F10Ah)  
  21. 00E4F101  mov         eax,dword ptr [ebp-44h]  
  22. 00E4F104  add         eax,1  
  23. 00E4F107  mov         dword ptr [ebp-44h],eax  
  24. 00E4F10A  cmp         dword ptr [ebp-44h],3  
  25. 00E4F10E  jge         main+70h (0E4F140h)  
  26.         {
  27.                 for(int j = 0; j < 4; ++j)
  28. 00E4F110  mov         dword ptr [ebp-50h],0  
  29. 00E4F117  jmp         main+52h (0E4F122h)  
  30. 00E4F119  mov         eax,dword ptr [ebp-50h]  
  31. 00E4F11C  add         eax,1  
  32. 00E4F11F  mov         dword ptr [ebp-50h],eax  
  33. 00E4F122  cmp         dword ptr [ebp-50h],4  
  34. 00E4F126  jge         main+6Eh (0E4F13Eh)  
  35.                 {
  36.                         arr[i][j] = 0;
  37. 00E4F128  mov         eax,dword ptr [ebp-44h]  
  38. 00E4F12B  shl         eax,4  
  39. 00E4F12E  lea         ecx,arr[eax]  
  40. 00E4F132  mov         edx,dword ptr [ebp-50h]  
  41. 00E4F135  mov         dword ptr [ecx+edx*4],0  
  42.                 }
  43. 00E4F13C  jmp         main+49h (0E4F119h)  
  44.         }
  45. 00E4F13E  jmp         main+31h (0E4F101h)  

  46.         return 0;
  47. 00E4F140  xor         eax,eax  
  48. }
  49. 00E4F142  push        edx  
  50. 00E4F143  mov         ecx,ebp  
  51. 00E4F145  push        eax  
  52. 00E4F146  lea         edx,ds:[0E4F164h]  
  53. 00E4F14C  call        @_RTC_CheckStackVars@8 (0E4B341h)  
  54. 00E4F151  pop         eax  
  55. 00E4F152  pop         edx  
  56. 00E4F153  pop         edi  
  57. 00E4F154  pop         esi  
  58. 00E4F155  pop         ebx  
  59. 00E4F156  mov         ecx,dword ptr [ebp-4]  
  60. 00E4F159  xor         ecx,ebp  
  61. 00E4F15B  call        @__security_check_cookie@4 (0E4B42Ch)  
  62. 00E4F160  mov         esp,ebp  
  63. 00E4F162  pop         ebp  
  64. 00E4F163  ret  
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-15 22:40:27 | 显示全部楼层
  1. arr[i][j] = 0;
  2. 00E4F128  mov         eax,dword ptr [ebp-44h]  
  3. 00E4F12B  shl         eax,4  
  4. 00E4F12E  lea         ecx,arr[eax]  
  5. 00E4F132  mov         edx,dword ptr [ebp-50h]  
  6. 00E4F135  mov         dword ptr [ecx+edx*4],0
复制代码


在汇编语言中就是一个一维数组
这是对数组的寻址部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-15 23:23:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 57158597@qq.com 于 2018-6-17 17:49 编辑

mov al,a[bx][si]这行代码是错误的,什么意思都不代表
二维数组是可以用汇编表示的,就看你怎么理解和应用了
如下:


assume cs:codesg

data segment
   sz db  1,  2,  3,  4, 5,  6, 7,  8,  9,10,11,12,13,14,15,16     ;数组sz的全部内容
      db 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
      db 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
      db 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
data ends  

codesg segment
   start: mov ds,offset sz    ;把数组所在的段地址放入DS
           mov bx,0*16         ;bx=0*16表示1行,1*16第2行,2*16第3行(这个0*16的表达是不对的,我这样写是方便看)
           mov si,0            ;s=0标识第1列,si=1标识第2列以此类推
           mov ax,[bx][si]      ;这里的ax=1,1行1列的位置是1(也可以这么写mov ax,[bx+si]  )
           mov bx,2*16
           mov si,5
           mov ax,[bx][si]     ;这里的ax=38,3行6列的位置                  
                  
           mov ax,4c00h      
           int 21h
codesg ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-15 23:44:10 | 显示全部楼层
57158597@qq.com 发表于 2018-6-15 23:23
mov al,a[si]这行代码是错误的,什么意思都不代表
二维数组是可以用汇编表示的,就看你怎么理解和应用了
...

也就是说需要3个一维数组,第1个和第2个一维数组用来存储第3个一维数组的地址,第3个一维数组用来存储数据?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-15 23:48:25 | 显示全部楼层
57158597@qq.com 发表于 2018-6-15 23:23
mov al,a[si]这行代码是错误的,什么意思都不代表
二维数组是可以用汇编表示的,就看你怎么理解和应用了
...

如果是这样,那2010存储单元可能会由于程序而被占用,怎么解决这种情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-15 23:50:17 | 显示全部楼层
人造人 发表于 2018-6-15 22:37
汇编语言是低级语言,在汇编语言中貌似没有二维数组的概念
C语言中的二维数组到汇编语言以后就成这样了

...

c语言的二维数组好理解,放在汇编还真的难理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-15 23:50:58 | 显示全部楼层
帝企鹅的日记 发表于 2018-6-15 23:48
如果是这样,那2010存储单元可能会由于程序而被占用,怎么解决这种情况

在数据段定义好,我等个详细点的代码给你看把,刚才写那个是临时写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-15 23:52:10 | 显示全部楼层
帝企鹅的日记 发表于 2018-6-15 23:50
c语言的二维数组好理解,放在汇编还真的难理解。

汇编语言中就没有二维数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-16 00:07:19 | 显示全部楼层
assume cs:codesg

data segment
   sz db  1,  2,  3,  4, 5,  6, 7,  8,  9,10,11,12,13,14,15,16     ;数组sz的全部内容
      db 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
      db 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
      db 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
data ends  

codesg segment
   start: mov ds,offset sz    ;把数组所在的段地址放入DS
           mov bx,0*16         ;bx=0*16表示1行,1*16第2行,2*16第3行(这个0*16的表达是不对的,我这样写是方便看)
           mov si,0            ;s=0标识第1列,si=1标识第2列以此类推
           mov ax,[bx+si]      ;这里的ax=1,1行1列的位置是1
           mov bx,2*16
           mov si,5
           mov ax,[bx+si]       ;这里的ax=38,3行6列的位置                  
                  
           mov ax,4c00h      
           int 21h
codesg ends
end start

这样看能理解了把?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-16 00:12:37 | 显示全部楼层
本帖最后由 57158597@qq.com 于 2018-6-16 11:18 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-16 00:32:35 | 显示全部楼层
人造人 发表于 2018-6-15 23:44
也就是说需要3个一维数组,第1个和第2个一维数组用来存储第3个一维数组的地址,第3个一维数组用来存储数 ...

不是这意思,我上面临时乱写的表达的意思有点不对,完整的发在后面了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-16 13:12:34 | 显示全部楼层
57158597@qq.com 发表于 2018-6-16 00:32
不是这意思,我上面临时乱写的表达的意思有点不对,完整的发在后面了

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

使用道具 举报

 楼主| 发表于 2018-6-16 20:08:12 | 显示全部楼层
57158597@qq.com 发表于 2018-6-16 00:32
不是这意思,我上面临时乱写的表达的意思有点不对,完整的发在后面了

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

使用道具 举报

发表于 2018-6-16 23:14:27 | 显示全部楼层

答案对了就给个最佳答案呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-17 17:45:02 | 显示全部楼层

我后面发的代码你都没看到吧?我把最佳答案改成后面发的代码了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-18 22:13:59 | 显示全部楼层
57158597@qq.com 发表于 2018-6-17 17:45
我后面发的代码你都没看到吧?我把最佳答案改成后面发的代码了

我看到了,前面的更容易理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 23:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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