在单词数组中将指针增加 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:从两个单词之间加载一个单词?的主要内容,如果未能解决你的问题,请参考以下文章