字符串的定义
- mov ax,“he”
编译之后将字符串对应的assic码——>转换为16进制,再存到寄存器中。
“he”——>06865h
68——>h 65——>e
寄存器中高位 存放 高数据(68)
1、cs和ip(段寄存器)结合在一起代表当前代码所对应的内存地址。
2、字符串在内存中显示为逆序。
3、每个寄存器(16位)只能存放2B即2个字节,不能完整输出hello,需要将“ll”值给其他寄存器
4、无法获取数据地址,不能对字符串进行修改。
解决上述问题(另外一种方式定义字符串)
-
首先需在内存中申请一块空间,可以使用伪指令db和dw
db——>define byte;定义字节
dw——>define word;定义字(16位的cpu为2字节) -
例如
db 1,2,3; 占用3B内存,且顺序为正序,地址从小到打依次存储1,2,3
dw 1,2,3;占用6B内存
db “hello”;每个字符开辟一个字节
dw “hello”;开辟的内存空间必须是字长的整数倍,6B,最后使用0补齐
获取字符串
- 定义字符串时标记字符串
例:
str dw “hello”;伪指令
start: //程序入口(才不会处理伪指令),指令开始的位置start为变量名
mov ax,str;指令
end start
mov ax,str并未将字符串"hello"赋值给ax寄存器,而是将字符串在内存中的偏移地址赋值给ax
将DS内数值当作段地址,与偏移地址结合得到字符串内存地址
- 如何获取段地址
– 方法1:直接从内存中找(仅限调试阶段)
– 方法2:使用段进行包裹,段可以提供一个段地址
data segment;data也为标记名(段的名称)
str dw “hello”
data ends
start:
mov ax,str;指令
end start
data segment
str dw “hello”
data ends
start:
mov ax,data
mov ds,ax;
mov ax,str
end start
可通过段的名称=data获取其中包裹数据对应的段地址。
然后再将真实的段地址赋值给ds,然后在将str读取到(注意寄存器只能显示2B,且是地位)