帝企鹅的日记 发表于 2018-6-15 21:46:56

如何建立二维数组,二维数组又是怎样调用的,求助!!!

我在百度并没有搜到汇编语言中二维数组的定义与使用!
a db 10 dup (10 dup(0))——>数组是这样定义的吗?,如果是,那它的存储空间是连续,怎么能表示行列呢?
...
mov bx,0
mov si,0
mov al,a->请问这条语句中,bx表示行吗?,si表示列吗?
求解答
感谢!!!!!

人造人 发表于 2018-6-15 22:37:16

汇编语言是低级语言,在汇编语言中貌似没有二维数组的概念
C语言中的二维数组到汇编语言以后就成这样了
#include <stdio.h>

int main(void)
{
        int arr;
        for(int i = 0; i < 3; ++i)
        {
                for(int j = 0; j < 4; ++j)
                {
                        arr = 0;
                }
        }

        return 0;
}


#include <stdio.h>

int main(void)
{
00E4F0D0push      ebp
00E4F0D1mov         ebp,esp
00E4F0D3sub         esp,114h
00E4F0D9push      ebx
00E4F0DApush      esi
00E4F0DBpush      edi
00E4F0DClea         edi,
00E4F0E2mov         ecx,45h
00E4F0E7mov         eax,0CCCCCCCCh
00E4F0ECrep stos    dword ptr es:
00E4F0EEmov         eax,dword ptr
00E4F0F3xor         eax,ebp
00E4F0F5mov         dword ptr ,eax
        int arr;
        for(int i = 0; i < 3; ++i)
00E4F0F8mov         dword ptr ,0
00E4F0FFjmp         main+3Ah (0E4F10Ah)
00E4F101mov         eax,dword ptr
00E4F104add         eax,1
00E4F107mov         dword ptr ,eax
00E4F10Acmp         dword ptr ,3
00E4F10Ejge         main+70h (0E4F140h)
        {
                for(int j = 0; j < 4; ++j)
00E4F110mov         dword ptr ,0
00E4F117jmp         main+52h (0E4F122h)
00E4F119mov         eax,dword ptr
00E4F11Cadd         eax,1
00E4F11Fmov         dword ptr ,eax
00E4F122cmp         dword ptr ,4
00E4F126jge         main+6Eh (0E4F13Eh)
                {
                        arr = 0;
00E4F128mov         eax,dword ptr
00E4F12Bshl         eax,4
00E4F12Elea         ecx,arr
00E4F132mov         edx,dword ptr
00E4F135mov         dword ptr ,0
                }
00E4F13Cjmp         main+49h (0E4F119h)
        }
00E4F13Ejmp         main+31h (0E4F101h)

        return 0;
00E4F140xor         eax,eax
}
00E4F142push      edx
00E4F143mov         ecx,ebp
00E4F145push      eax
00E4F146lea         edx,ds:
00E4F14Ccall      @_RTC_CheckStackVars@8 (0E4B341h)
00E4F151pop         eax
00E4F152pop         edx
00E4F153pop         edi
00E4F154pop         esi
00E4F155pop         ebx
00E4F156mov         ecx,dword ptr
00E4F159xor         ecx,ebp
00E4F15Bcall      @__security_check_cookie@4 (0E4B42Ch)
00E4F160mov         esp,ebp
00E4F162pop         ebp
00E4F163ret

人造人 发表于 2018-6-15 22:40:27

arr = 0;
00E4F128mov         eax,dword ptr
00E4F12Bshl         eax,4
00E4F12Elea         ecx,arr
00E4F132mov         edx,dword ptr
00E4F135mov         dword ptr ,0

在汇编语言中就是一个一维数组
这是对数组的寻址部分

57158597@qq.com 发表于 2018-6-15 23:23:40

本帖最后由 57158597@qq.com 于 2018-6-17 17:49 编辑

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


assume cs:codesg

data segment
   sz db1,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,      ;这里的ax=1,1行1列的位置是1(也可以这么写mov ax,)
         mov bx,2*16
         mov si,5
         mov ax,   ;这里的ax=38,3行6列的位置                  
                  
         mov ax,4c00h      
         int 21h
codesg ends
end start

人造人 发表于 2018-6-15 23:44:10

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

也就是说需要3个一维数组,第1个和第2个一维数组用来存储第3个一维数组的地址,第3个一维数组用来存储数据?

帝企鹅的日记 发表于 2018-6-15 23:48:25

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

如果是这样,那2010存储单元可能会由于程序而被占用,怎么解决这种情况

帝企鹅的日记 发表于 2018-6-15 23:50:17

人造人 发表于 2018-6-15 22:37
汇编语言是低级语言,在汇编语言中貌似没有二维数组的概念
C语言中的二维数组到汇编语言以后就成这样了

...

c语言的二维数组好理解,放在汇编还真的难理解。{:5_99:}

57158597@qq.com 发表于 2018-6-15 23:50:58

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

在数据段定义好,我等个详细点的代码给你看把,刚才写那个是临时写的

人造人 发表于 2018-6-15 23:52:10

帝企鹅的日记 发表于 2018-6-15 23:50
c语言的二维数组好理解,放在汇编还真的难理解。

汇编语言中就没有二维数组

57158597@qq.com 发表于 2018-6-16 00:07:19

assume cs:codesg

data segment
   sz db1,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,      ;这里的ax=1,1行1列的位置是1
         mov bx,2*16
         mov si,5
         mov ax,       ;这里的ax=38,3行6列的位置                  
                  
           mov ax,4c00h      
           int 21h
codesg ends
end start

这样看能理解了把?

57158597@qq.com 发表于 2018-6-16 00:12:37

本帖最后由 57158597@qq.com 于 2018-6-16 11:18 编辑

{:5_108:} {:5_108:}

57158597@qq.com 发表于 2018-6-16 00:32:35

人造人 发表于 2018-6-15 23:44
也就是说需要3个一维数组,第1个和第2个一维数组用来存储第3个一维数组的地址,第3个一维数组用来存储数 ...

不是这意思,我上面临时乱写的表达的意思有点不对,完整的发在后面了

人造人 发表于 2018-6-16 13:12:34

57158597@qq.com 发表于 2018-6-16 00:32
不是这意思,我上面临时乱写的表达的意思有点不对,完整的发在后面了

帝企鹅的日记 发表于 2018-6-16 20:08:12

57158597@qq.com 发表于 2018-6-16 00:32
不是这意思,我上面临时乱写的表达的意思有点不对,完整的发在后面了

好的,感谢{:5_106:}

57158597@qq.com 发表于 2018-6-16 23:14:27

帝企鹅的日记 发表于 2018-6-16 20:08
好的,感谢

答案对了就给个最佳答案呗

57158597@qq.com 发表于 2018-6-17 17:45:02

帝企鹅的日记 发表于 2018-6-16 20:08
好的,感谢

我后面发的代码你都没看到吧?我把最佳答案改成后面发的代码了

帝企鹅的日记 发表于 2018-6-18 22:13:59

57158597@qq.com 发表于 2018-6-17 17:45
我后面发的代码你都没看到吧?我把最佳答案改成后面发的代码了

我看到了,前面的更容易理解
页: [1]
查看完整版本: 如何建立二维数组,二维数组又是怎样调用的,求助!!!