【发布时间】:2018-09-03 09:50:15
【问题描述】:
我正在尝试获取字符串的第二个字符(例如Test 中的e)。使用emu8086编译。
当我这样做时:
str db 'Test$'
...
mov si, 1 ; get second character of str
mov bl, str[si] ; store the second character
mov ah, 2 ; display the stored character
mov dl, bl
int 21h
输出为e。
但是当我这样做时:
str db 25
db ?
db 25 dup (?)
...
mov ah, 0ah ; accept a string
lea dx, str ; store input in variable str
int 21h
mov si, 1 ; get second character of str (??)
mov bl, str[si] ; store the second character
mov ah, 2 ; display the stored character
mov dl, bl
int 21h
我收到♦。
当我将第二个 sn-p 的“获取 str 的第二个字符”部分更改为:
mov si, 3 ; get second character of str (why is it '3' instead of '1'?)
mov bl, str[si] ; store the second character
我收到e。
我不明白。虽然它在第一个 sn-p 中有效,但如果我试图引用字符串的第二个字符,为什么在第二个 sn-p 中我将 SI 设置为 3 而不是 1?还是我使用的方法被误导了?
【问题讨论】:
-
行
str db 25、db ?、db 25 dup (?)做什么? -
@Ivan 至少我是怎么理解的,这些行是为了满足调用服务
0ah接受字符串并将其存储在str中的要求。str db 25定义允许输入的最大字符数(这里是 25),db ?是用户输入的字符数(定义为未知),db 25 dup (?)存储接受为输入的字符(定义为 25 个未知字符)。 stackoverflow.com/a/29517960/8919391 -
我认为您应该查看spike.scu.edu.au/~barry/interrupts.html#ah0a 了解详细信息。您可能会在那里找到答案。
-
该结构的第二个字节在某些 DOS 版本上也是“输入”参数,告诉 DOS 原始缓冲区中有多少字节实际上对“调用输入”有效,所以不是
db ?它使用db 0让 DOS 知道当前缓冲区是完全未定义的保留内存更安全。但是所有示例都使用“db?”是很常见的。对于那个 0A 结构中的第二个值,所以不用担心,它无论如何都会组装为db 0。这是 JFYI 评论,也试图让您了解细微的细节如何影响 asm 代码的功能,以及您必须做到的精确程度......
标签: string assembly character x86-16 emu8086