【问题标题】:Accessing specific element of array of strings, with an integer index使用整数索引访问字符串数组的特定元素
【发布时间】:2021-06-05 05:35:29
【问题描述】:

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

例如,

我想生成随机数 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

【问题讨论】:

  • 如果您将代码更改为使用固定大小以便您可以使用address = array0 + size*idx,您为什么接受线性搜索答案?
  • 其实他们两个都解决了我的问题。谢谢你们。
  • 好的,但是搜索方式的效率要低得多,如果你让你的所有字符串长度相同,你只会这样写,到制作一个记录数组。

标签: arrays string assembly emu8086


【解决方案1】:

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 

代码更长更慢,但它节省了数据部分的空间,因为字符串不必填充到统一长度。

【讨论】:

  • 有趣!这最终比我预期的更紧凑,甚至不需要范围检查,因为rep 在进行第一次比较和递增之前检查 CX==0。当然,对于像 65535 或 0 这样的非常高的 BX,它可能会非常慢。 (嗯,我认为您确实需要测试 bx,bx / jz 以完全跳过搜索,除非您在第一个真实字符串之前放置一个虚拟 '$'。BX = 0 应该给您array0,而不是敲打您的 65536 次迭代对着arrayEnd :P)
  • 感谢它运作良好。那么我怎么能生成随机数。我对 asm 完全陌生,我有过 java、C# 的经验,所以 asm 对我来说就像火箭科学:)
  • @4GRi 真正的随机性很难获得。对于一个玩具项目,我希望获得当前时间的秒数MOV AH,2Ch; INT 21h,将它们除以字符串数组长度 (10),并将余数用作伪随机数 0..9。
  • 嗨,谢谢我在这里使用了打开的主题中的这段代码。 [网址]stackoverflow.com/questions/17855817/…
【解决方案2】:

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

您需要填充到某个固定的最大大小,以便您可以缩放像 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),则字符串数据将作为代码执行。不要那样做;把你的数据放在最后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多