使用整数索引访问字符串数组的特定元素

Accessing specific element of array of strings, with an integer index

我想使用随机生成的数字访问数组的特定元素。

例如,

我想生成随机数0-9。生成数字后(在这个例子中我们假设生成的随机数为4),我想访问array5并打印屏幕。

我怎么能成功。

字符串数组初始化代码如下

我将代码编辑为等长字符串,如下所示。每个字符串有 8 个字符。

如何生成随机数?

org 100h

array0:    db      "abstract", 0Dh,0Ah, 24h
array1:    db      "academic", 0Dh,0Ah, 24h
array2:    db      "accurate", 0Dh,0Ah, 24h
array3:    db      "bacteria", 0Dh,0Ah, 24h
array4:    db      "attorney", 0Dh,0Ah, 24h
array5:    db      "equation", 0Dh,0Ah, 24h
array6:    db      "umbrella", 0Dh,0Ah, 24h
array7:    db      "overcome", 0Dh,0Ah, 24h
array8:    db      "universe", 0Dh,0Ah, 24h
array9:    db      "analysis", 0Dh,0Ah, 24h

那不是数组;元素的长度不尽相同。

您需要填充到某个固定的最大大小,以便您可以缩放像 C
这样的索引 struct {char c[16];} arr[10]; 创建一个固定大小的字符串缓冲区数组。
或者制作一个单独的指针数组,如 arr: dw array0, array1, ...

Initialise array of strings in assembly 显示了两种方式的示例。对于您的情况,要填充您可能在每个条目之前使用 align 16 的条目,这将在该位置发出填充字节,直到当前地址是 16 的倍数。

(按 16 缩放索引通常是 shl di, 4 或任何寄存器,但原始 8086 没有立即移位。所以 mov cl,4 / shl di, cl 如果你需要兼容古老的硬件/模拟器。)


要索引您当前拥有的内容(字符串的扁平连接),您可能需要线性搜索第 4 个 24h 字节。第 5 个字符串在该字节之后开始。

此外,如果您实际上将此数据放在 .com 可执行文件 (org 100h) 的文件顶部,则字符串数据将作为代码执行。不要那样做;把你的数据放在最后。

Peter 解决方案的另一种方法是 扫描 $ 终止符 random_number 次:

     MOV BX,random_number   
     MOV DI,offset array0  ; Beginning of strings. 
     MOV CX,offset arrayEnd; A label below all "arrays".
     SUB CX,DI             ; Let CX=total size of all strings.
     MOV AL,24h            ; '$' which terminates each string.
     CLD                   ; Ascending scan.
Next:REPNE SCASB           ; Search for '$', start at ES:DI.
     DEC BX                ; 
     JNZ Next              ; Repeat random_number times.
     MOV DX,DI             ; DI now points to the desired string.
     MOV AH,9              ; Use DOS function to print it. 
     INT 21h               ; Output $-terminated string at DS:DX.
     RET                   ; Terminate COM program.
    ; Data section follows:
array0:  db "Car", 0Dh, 0Ah, 24h  
 ...
arrayEnd:db 24h             ; End of strings 

代码比较长,比较慢,但是节省了数据段space,因为字符串不必塞到统一长度