53.王爽汇编语言学习笔记

jmp 2AE3:3;CS=2AE3H,IP=0003H

jmp ax;只能用某一合法寄存器的值来修改IP的值

地址寄存器不能用立即数mov,而是得通过合法的寄存器来mov

;将(1000:0)中的数据读到al中
mov bx,1000H
mov ds,bx
mov al,[0];0是ds偏移量为0处的数据地址

注意操作ax用mov时,地址的进入低八位 ,地址加一进入高八位

8086的入栈和出栈都是以字为单位

push和pop后接寄存器,不能是立即数。栈顶指针是用SS:SP来描述

8086没有预防超栈的机制

push时sp-2,数据进去;pop时sp+2,数据出去。空栈时,sp指向0(因为sp在剩下最后一个元素的时候,为FFFEH,pop后减2变成0)

inc bx;使bx自增1

loop循环,计算2的11次方,利用cx寄存器。到loop时,cx减一,若不为零则回到s处进行循环

mov ax,2
mov cx,11
s:add ax,ax
  loop s

可以将ah赋0,al赋地址上的数,就可以把一个8位的数赋到ds(16位)上了。bx用作偏移地址变化

mov ax,ds:[bx]

dw即define word

通过and和or对寄存器的某一位进行设0或设1.

stdcall 是 StandardCall 的缩写,是C++的标准调用方式。

.model flat,stdcall 程序工作模式,
flat为Windows程序使用的模式(代码和数据使用同一个4GB段),
stdcall为API调用时右边的参数先入栈

DOSSEG排列段次序

Orders the segments according to the MS-DOS segment convention: CODE first, then segments not in DGROUP, and then segments in DGROUP. (32-bit MASM only.)

lea对变量没有影响是取地址,对寄存器来说加[]时取值,第二操作数不加[]非法

mov对变量来说没有影响是取值,对寄存器来说是加[]时取地址,第二操作数不加[]是取值

将ASCII的小写字母转化为大写字母,只要将第六位的1置0就好了,用1101_1111B去and就好了

定义string尽量用db

奇数放高位,偶数放低位

div指令下,8位,AL存商,AH存余数;16位,AX存商,DX存余数

DUP:duplicate

mov ax,offset s

adblock可以自定义过滤选项

53.王爽汇编语言学习笔记_第1张图片

jcxz 标号(若cx等于0,转到标号处执行,否则什么都不做,程序继续往下执行)

所有循环指令都是短转移

奇偶性(parity)。奇偶校验标志位:PF。8086是看是否有偶数个1

adc ax,1相当于ax=ax+1+CF

sbb是带借位的减法

cmp 对象1,对象2,相当于减法,只不过计算结果不在ax中保存,只影响FLAGS

考察正负的时候要考虑sf和of

je,jne,jb,jnb,ja,jna

equal,below,above

df决定了si和di的改变方向。用指令cld清0,std置1

pushf和popf是将标志寄存器的值入栈和出栈

中断类型码-中断向量表-中断表项(高地址放段空间,低地址放偏移地址)

端口读写用in out

内中断过程:

1.取中断类型码n

2.标志寄存器入栈,IF=0,TF=0

3.CS,IP入栈

4.IP=(n*4) CS=(n*4+2)

而可屏蔽中断在IF=0时被禁止

sti 设置IF=1

rti IF清零

按下按键产生的扫描码称为通码,松开是断码。断码=通码+80h

 

 

 

 

 

 

你可能感兴趣的:(53.王爽汇编语言学习笔记)