所以我有这个汇编程序来更改数组的内容。执行后数组的内容是多少,array_length的值是多少?
问题是,在第二次调用过程 Procm 时,si = 10 然后 si = 16 但我的数组长度是 9。 mov ax, array[si] 之后 ax 的内容是什么?是内存地址的内容吗?
DOSSEG
.MODEL SMALL
.STACK 200h
.DATA
array dw 9 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,1
array_length EQU $-array
l1 EQU 3
.CODE
start: mov ax, @DATA
mov ds, ax
mov si, 2*l1-2
call Procm
mov si, 4*l1-2
call Procm
mov si, 6*l1-2
call Procm
mov si, 6*l1-2
call Procm
mov si, 6*l1-2
call Procm
mov ax, 4c00h
int 21h
Procm PROC NEAR
mov cx, l1-1
mov ax, array[si]
B1: mov bx, array[si-2]
mov array[si], bx
sub si, 2
loop B1
mov array[si], ax
FIN: ret
Procm ENDP
nop
end start
array dw 9 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,1 array_length EQU $-array
执行后array_length的值为多少?
array_length的值在程序执行过程中不会改变。它是在汇编时计算的,并在程序的整个生命周期中保持不变。
因为您的公式 (
$-array
) 计算数组末尾和数组开头之间的差,并且考虑到数组包含 9 个字大小的值,结果将为 18。
但是我的数组长度是9
正确。 你的公式计算出的是数组的大小。要获得数组的长度,您必须除以数组的类型。
这些组合起来为“长度”=“尺寸”/“类型”。
问题是在第二次调用过程 Procm 时,si = 10 然后 si = 16 但我的数组长度是 9。
大多数高级语言会使用 0 到 8 范围内的索引来寻址 9 元素数组,但在汇编中,程序中使用的 SI 参数并不意味着是这样的索引,而是所占用内存的 offset通过数组。由于这 9 个字大小的值占用 18 个字节的内存块,因此偏移量 10 和 16 完全没问题。
后面的ax的内容是什么?是内存地址的内容吗?mov ax, array[si]
它使用数组中偏移 SI 处找到的单词加载 AX。
数组的内容是什么?
查看数组字节(存储在内存中)如何随着每次调用 Procm 过程而变化:
9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0
^
SI=4
7,0,9,0,8,0,6,0,5,0,4,0,3,0,2,0,1,0
^
SI=10
7,0,9,0,8,0,4,0,6,0,5,0,3,0,2,0,1,0
^
SI=16
7,0,9,0,8,0,4,0,6,0,5,0,1,0,3,0,2,0
^
SI=16
7,0,9,0,8,0,4,0,6,0,5,0,2,0,1,0,3,0
^
SI=16
7,0,9,0,8,0,4,0,6,0,5,0,3,0,2,0,1,0
因为很难区分
l
和 1
,为了便于阅读,最好不要命名您的标识符 l1
。