;*********************************************************
TITLE 汇编程序的二维数组的访问
;*********************************************************
;*********************************************************
;程序运行平台说明
.386
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE
;*********************************************************
;*********************************************************
;文件包含
INCLUDE Irvine32.inc
;*********************************************************
;*********************************************************
;数据段定义
.DATA
tablename byte 10,42,5,6,1
RowSize=$-tablename
byte 10,20,20,30,5
byte 20,85,74,61,10
strEnter byte 0dh,0ah,0
strSpace byte " ",0
;*********************************************************
;*********************************************************
;代码段定义
.CODE
main proc
;设定外层循环的次数
mov ecx,3
;表示行数
xor esi,esi
L1:
;压入堆栈,方便我们在列循环时使用
push ecx
mov ecx,RowSize
;ebx作为列数进行计算
xor ebx,ebx
L2:
;开始输出
;获得每一行的数目,方便进行行的偏移
mov ax,RowSize
;eax当中方的是行偏移
mul esi
;然后进行列偏移的计算
add eax,ebx
;因为每个数组元素都是byte所以使用dl来取出
mov dl,tablename[eax]
;eax清空单纯存放al
xor eax,eax
mov al,dl
call WriteInt
mov edx,offset strSpace
call WriteString
;列偏移加一
inc ebx;
loopd L2;
mov edx,offset strEnter
call WriteString
;行数加一
inc esi;
pop ecx
loopd L1;
exit
main endp
end main
;*********************************************************
汇编程序中二维数组的访问,不像高级程序设计语言中的那么简便,我们必须自己计算在数组首地址基础上的偏移,
结构化的设计,也就是外层行数,内层保存列数,外层循环和内层循环都是用ecx来作为标记,外层ecx,然后压入堆栈,被内层使用,
但是同时,ecx不方便用户来作为索引,因为ecx是由大变小,反向增长的,所以必须使用另外一个变量来从小到大的变化,这里esi用来记录行的大小,ebx用来记录列的大小