x86 汇编 tasm 中越界数组元素的内容

问题描述 投票:0回答:1

所以我有这个汇编程序来更改数组的内容。执行后数组的内容是多少,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
arrays assembly memory tasm
1个回答
0
投票

回答所有不同的问题

array dw 9 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,1
array_length EQU $-array

执行后array_length的值为多少?

array_length的值在程序执行过程中不会改变。它是在汇编时计算的,并在程序的整个生命周期中保持不变。
因为您的公式 (

$-array
) 计算数组末尾和数组开头之间的差,并且考虑到数组包含 9 个字大小的值,结果将为 18。

但是我的数组长度是9

正确。 你的公式计算出的是数组的大小。要获得数组的长度,您必须除以数组的类型。

  • LENGTHOF 返回数组中的元素数量。
  • SIZEOF 返回数组初始值设定项使用的字节数。
  • TYPE 返回数组中一个元素使用的字节数。

这些组合起来为“长度”=“尺寸”/“类型”。

问题是在第二次调用过程 Procm 时,si = 10 然后 si = 16 但我的数组长度是 9。

大多数高级语言会使用 0 到 8 范围内的索引来寻址 9 元素数组,但在汇编中,程序中使用的 SI 参数并不意味着是这样的索引,而是所占用内存的 offset通过数组。由于这 9 个字大小的值占用 18 个字节的内存块,因此偏移量 10 和 16 完全没问题。

mov ax, array[si]
后面的ax的内容是什么?是内存地址的内容吗?

它使用数组中偏移 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

© www.soinside.com 2019 - 2024. All rights reserved.