0x16:包含多个段的程序
1.在代码段中使用数据
1 | ;计算 8 个数据的和存到 ax 寄存器 |
如果把上面程序的start和end后面的start去掉,然后debug会发现 cs:ip 的前 16 个字节并不是我们想看到的“第一条”指令:mov bx, 0
。
是因为前16个字节被dw
定义的8个字占用了,这样需要修改 ip 的内容使其从 0010 开始执行。(这样直接运行会出问题,找不到入口地址,需要用debug修改 ip 内容)
如果加上start就会发现 cs:ip 会直接从 cs:0010 开始。(不需要手动修改)
2.在代码段中使用栈
1 | ;利用栈,将程序中定义的数据逆序存放。 |
VScode MASM插件的一个问题:asm文件不能命名为 1.asm。
3.将数据、代码、栈放入不同的段
1 | assume cs:code,ds:data,ss:stack |
定义数据段和栈段就与代码段一样使用assume
关键字。
定义中的段号就代表了段地址,如stack表示栈段的段地址。
0x17:and 和 or 指令
0x18:关于 ASCII 码
以字符形式给出的数据:
1 | assume cs:code,ds:data |
大小写转换:
1 | assume cs:codesg,ds:datasg |