汇编
汇编语言包含两种指令:
- 汇编指令
- 伪指令
伪指令
没有对应的机器指令,最终不会被CPU执行。伪指令是编译器执行的指令。
segement和ends
segement 表示一个段的开始,ends表示一个段的结束
段名 segment 段名 ends 比如: codesg segement codesg ends;
end
表示一个汇编程序的结束标记,编译器在编译的时候如果碰到了end,就会结束对源程序的编译
assume
假设某一段寄存器和程序中的某一个用
segment...ends
定义的段相关联。
标号
一个标号指代了一个地址,
步过循环p
遇到loop使用p来进行跳过
跳到指定的语句g ip
使用g ip跳到指定语句
start 告诉程序的入口
assume cs:code code segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h start: mov bx, 0 ; 跳过前面的数据,不加start代码会从数据处开始 mov ax, 0 mov cx, 8 s:add ax, cs:[bx] add bx, 2 loop s mov ax, 4c00h int 21h code ends end start
汇编指令
汇编只有是有对应的机器码的指令,可以被便以为机器指令,最终为CPU所执行。
loop
assume cs:code code segment mov ax,2 mov cx,11 s: add ax,ax loop s mov ax, 4c00H int 21H code ends end
loop 执行之后,寄存器cx会自动减一,直到减到0,跳出循环执行loop的下一条语句
段前缀 ds, cs, ss, es
指令mov ax, [bx]
中,内存的那元的偏移地址由bx给出,而段地址默认在ds中。我们可以在访问内存单元的指令中显式地给出内存单元的段地址所在的段寄存器。
例如
mov ax, ds:[bx] mov ax, cx:[bx] mov ax, ss:[bx] mov ax, es:[bx] mov ax, ss:[0] mov ax, cs:[0]
[bx+idata]
表示一个内存单元,偏移地址+idata = 新的偏移地址
常用格式, 下面的写法都是将bx + 200
mov ax, [200 + bx] mov ax, 200[bx] mov ax, [bx].200
SI和DI
SI和DI是8086CPU中和BX功能相近的寄存器
下面3组指令实现了相同的功能
; 1 mov bx, 0 mov ax, [bx] ;2 mov si, 0 mov ax, [si] ;3 mov di, 0 mov ax, [di]
[bx + si]
和 [bx + di] 的用法一样
[bx + si]
表示一个内存单元,它的偏移地址为(bx) + (si)(即bx中的数值加上si中的数值)
常用格式
;1 mov ax, [bx + si] ;2 mov ax, [bx][si]
[bx + si + idata]和[bx + di + idata]的用法一样
[bx + si + idata]表示一个内存单元,它的偏移地址为(bx) + (si) + idata(即bx中的值加上si中的值再加上idata)
常用格式
;1 mov ax, [bx + 200 + si] ;2 mov ax, [200 + bx + si] ;3 mov ax, 200[bx][si] ;4 mov ax, [bx].200[si] ;5 mov ax, [bx][si].200
通过and和or转换大小写
转换为大写
and al, 11011111b
转换为小写
or al, 00100000b
reg表示寄存器sreg表示段寄存器
reg的集合包括:ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di
sreg的集合包括:ds, ss, cs, es
'