在单词数组中将指针递增 1:从两个单词的中间位置加载一个单词?
Incrementing a pointer by 1 in an array of words: loading a word from half way between two words?
考虑下面的代码。如果将 SI
递增 2 得到数组的第二个元素,那么将 SI
递增 1 会得到什么?
.data
var dw 1,2,3,4
.code
LEA SI,VAR
MOV AX,[SI]
INC SI
MOV AX,[SI]
语句 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
)。
您也可以在程序开头用一条指令 LODSW which does the same and occupies only one byte instead of five. In this case you should be sure to have the Direction flag reset (using the instruction CLD 替换 MOV AX,[SI]
和 ADD SI,2
。
考虑下面的代码。如果将 SI
递增 2 得到数组的第二个元素,那么将 SI
递增 1 会得到什么?
.data
var dw 1,2,3,4
.code
LEA SI,VAR
MOV AX,[SI]
INC SI
MOV AX,[SI]
语句 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
)。
您也可以在程序开头用一条指令 LODSW which does the same and occupies only one byte instead of five. In this case you should be sure to have the Direction flag reset (using the instruction CLD 替换 MOV AX,[SI]
和 ADD SI,2
。