在单词数组中将指针增加 1:从两个单词之间加载一个单词?

Posted

技术标签:

【中文标题】在单词数组中将指针增加 1:从两个单词之间加载一个单词?【英文标题】:Incrementing a pointer by 1 in an array of words: loading a word from half way between two words? 【发布时间】:2021-10-03 03:53:42 【问题描述】:

考虑下面的代码。如果将 SI 增加 2 给我数组的第二个元素,那么将 SI 增加 1 到底会给我什么?

.data  
var dw 1,2,3,4  
.code  
LEA SI,VAR  
MOV AX,[SI]  
INC SI  
MOV AX,[SI]

【问题讨论】:

提示:逐字节写出var的内存内容。请记住,x86 是 little-endian。 【参考方案1】:

语句var dw 1,2,3,4 告诉汇编器在内存中静态定义.data 段开头的八个字节。数据字节的布局将是

|01|00|02|00|03|00|04|00|

第一个 MOV AX,[SI] 将加载 01 的 AL 和 00 的 AH。 当您将 SI 仅增加 1 时,下一个 MOV AX,[SI] 将加载 00 的 AL 和 02 的 AH。 如果您想继续用整个 16 位字加载 AX,请将 SI 增加 2 (ADD SI,2)。

您还可以将MOV AX,[SI]ADD SI,2 替换为一条指令LODSW,它的作用相同,并且只占用一个字节而不是五个。在这种情况下,您应该确保重置方向标志(使用程序开头的指令CLD)。

【讨论】:

Nitpick: lodsw 不会像 add 那样改变标志。 @ecm 确实,用INC SI + INC SI 替换ADD SI,2 不会像ADD 那样改变CF :-) Flags-wise 这个LODSW 相当于MOV AX, [SI] LEA SI, [SI+2]

以上是关于在单词数组中将指针增加 1:从两个单词之间加载一个单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何在用户定义的函数中将数据库列作为参数传递?

如何在Ruby中将单词数组排序为字谜数组?

C语言:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开

在Java中将句子字符串转换为单词的字符串数组

在 Python 中将单词/数字与符号分开

在c ++中将单词拆分为字母? [关闭]