本文已参与「新人创作礼」活动,一起开启掘金创作之路。 [bx]与内存单元的描述
通过debug在代码段看出的指令内容与一开始所期望的不一样
ATTENTION
通过debug
-a 13eb:0 写入 mov ax, [0] ,正常将数据段偏移地址0位的内容填入ax中
但通过编辑器写的3.asm中写的 mov ax, [1] 在debug中的代码段只显示出 mov ax,01
[bx]是什么
和[0]有些类似,[0]表示内存单元,它的偏移地址是0
完整地描述一个内存单元,需要两种信息:
(1)内存单元的地址;
(2)内存单元的长度(类型);
我们用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出,比如前面的AX,AL。
如果直接在编辑器编辑的asm文件中写入mov ax, [0],编译器只会认为是把0传给ax寄存器。
若想把偏移地址为0对应的内存单元传过去可通过
编译器:
- mov bx, 0
- mov ax,[bx]
Debug:
mov ax,[0]
注意 描述性符号“()”
(X)
sp中存放偏移地址
约定符号idata表示常量
汇编 inc 和 dec 指令
知识点:
inc 加1指令
dec 减1指令
一、加一指令inc
inc a 相当于 add a,1 //i++
优点 速度比sub指令快,占用空间小
这条指令执行结果影响AF、OF、PF、SF、ZF标志位,但不影响CF进位标志位.
二、减一指令dec
dec a 相当于 sub a,1
004012D7 > 83E8 01 SUB EAX,1
004012DA 836D FC 01 SUB DWORD PTR SS:[EBP-4],1
004012DE 41 INC ECX
004012DE FF41 FC INC DWORD PTR DS:[ECX-4]
优点 速度比sub指令快,占用空间小
这条指令执行结果影响AF、OF、PF、SF、ZF标志位,但不影响CF进位标志位.
Loop指令
指令格式:loop 标号,CPU执行loop指令的时候,要进行两步操作:
- (cx)=(cx) -1;
- 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
cx中的值影响着loop指令的执行结果
通常用loop指令实现循环功能,cx中存放循环次数。
loop s(标号)
跳到s的地址
(1)标号
汇编语言中,一个标号代表一个地址,此程序中有一个标号s。它实际上认识了一个地址,这个地址处有一条指令:add ax,ax
(2)loop s
CPU执行loop指令的时候,要进行两步操作:
-
- (cx)=(cx) -1;
- 判断cx中的值,不为零则转至标号(s)处执行程序,如果为零则向下执行。
执行loop s时,首先要将(cx)减1
CX中的值变为0后,向下执行指令
cx和loop指令相配合实现循环功能的三要点:
(1)在cx中存放循环次数
(2)loop指令中的标号所标识地址要在前面
(3)要循环执行的程序段,要写在标号与loop指令的中间