使用整数索引访问字符串数组的特定元素
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,因为字符串不必塞到统一长度
我想使用随机生成的数字访问数组的特定元素。
例如,
我想生成随机数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,因为字符串不必塞到统一长度