汇编日记

地址线
数据线
控制线


mov  传送指令


mov  寄存器,数据
mov  寄存器,寄存器
mov  寄存器,内存单元
mov  内存单元,寄存器
mov  段寄存器,寄存器


add 同mov
sub 同mov


 
push(入栈)  寄存器  段寄存器  内存单元
pull(出栈)




inc 加一   
des 减一




and
or


字段元


物理地址 = 段地址 * 16 + 偏移地址


通用寄存器   16 H L  byte word         mov ax,1  mov ah,1  add ax,8  mov ax,bx
AX    累加器
BX    基址寄存器   循环[bx] 存放地址偏移量 inc bx   [BX+100] 100[BX] [BX].100   [bx+di/si+idata] 默认段地址DS
CX    计数寄存器   loop循环(cs)=(cs)-1  判断cs的值,不为零则跳到标号处,为零继续向下执行  mov cs,10  s: add ax,1  loop s
DX    数据寄存器   备用




和BX相近的寄存器  但是不能够分成2个8位寄存器  
SI 源变址寄存器
DI 目的变址寄存器


SP 堆栈指示器   偏移地址  SS
BP 基址指示器   段地址默认在SS
IP 指令指示器   指令指针偏移地址 CS


段寄存器   段前缀   64K
CS  代码段寄存器  CS:IP 不能用mov 应该用转移指令 jmp  jmp 段地址(CS):偏移地址(IP)  jmp 3,0B16  CS=0003H IP=0B16H  00B46H     jmp 某一个合法寄存器  用寄存器的只修IP  jmp ax, L类似于(jmp IP,ax)
DS  数据段寄存器   存放要访问数据的段地址  DS和[ADDRESS](偏移地址) mov bx,1000H mov ds,bx  1, mov ax,[0]--将1000H:0H的数据读入到ax   2, mov [0],ax --将ax的数据读入到1000H:0H
SS  堆栈寄存器     SS:SP指向栈顶元素  push ax  SP=SP-2 SS:SP指向新栈顶元素 将ax的数据读入新的栈顶内存  pop ax 将SS:SP内存处的数据存入ax,SP=SP+2 SS:SP指向新的栈顶
ES  附加段寄存器   备用
PSW




汇编指令  


伪指令  段名 segment(定义一个段)
            
段名 endS


assume(假设) cs:codesg(标号)  将代码段和CPU的cs联系起来


codesg segment
// 数据
dw 0001H,0002H,0003H
db 'unix'  // 字符形式 转换为ascii码
start: mov ax,0123H  // 代码
       mov bx,0456H
  add ax,bx
  add ax,ax
  
  mov ax,'a' // =mov ax,61H
   
  mov ax,4c00H  (程序返回)
  INT 21H
codesg ends


end start (汇编程序结束标志)  也可以知道入口是start






[bx] 和 loop


内存单元:(1)内存单元地址;(2)内存单元的长度(类型)


[bx] 也表示内存单元 偏移地址在bx
loop 循环


()描述性符号  (al)表示al中的值  (寄存器)(段寄存器)(内存单元的物理地址20位)
idata 表示常量 [idata] 表示[1][2][3]




aaaaH 写发错误  不能以字母开头 前面加0  0aaaaH


dw 0001H,0002H,0003H
dw = define word




数据处理的两个基本问题?
处理的数据在什么地方   CPU内部,内存,端口
处理的数据有多长      mov al,1  mov ax,1   或 无寄存器名字用 X(byte,word)  ptr   mov word ptr [bx],2 inc byte ptr [bx]


reg  表示寄存器 ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,si,di,sp,bp
sreg 表示段寄存器 cs,ds,es,ss




bx,di,si,bp 可以用在[...] 
[idata],直接寻址
[bx],[di],[si],[bp],寄存器间接寻址
[bx+idata],[di+idata],[si+idata],[bp+idata],寄存器相对寻址  结构体,数组,二位数组
[bx+di],[bx+si],[bp+di],[bp+si],基址变址寻址 二位数组
[bx+di+idata],[bx+si+idata],[bp+di+idata],[bp+si+idata],相对基址变址寻址  表格(结构)数组项,二位数组




读取,写入,计算








立即数idata,寄存器,段地址(SA)和偏移地址(EA)




转移指令
可以修改IP         段内转移   jmp ax  短转移-128~127  近转移-32768~32767
或同时修改CS:IP    段间转移   jmp 1000:0




无条件转移 JMP
条件转移 短转移  jcxz if((cx) == 0)  jcxz 标号
循环  短转移(loop) if((cx) != 0)  loop 标号
过程
中断




offset 取得标号的偏移地址
jmp  转移的目的地址   转移的距离




转移指令
call     1:将当前IP 或 CS和IP 压入栈中 2:转移   
        
    CALL 标号    1:(SP)=(SP)-2;   ((SS)*16+(SP)) = (IP)  2:(IP)=(IP)+16位位移   16位位移 = "标号"处的地址  call指令后的第一个字节的地址  范围-32768~32767   
         push ip jmp near ptr 标号
         
call  far ptr 标号  1:(SP)=(SP)-2;   ((SS)*16+(SP)) = (CS)  (SP)=(SP)-2;   ((SS)*16+(SP)) = (IP)  (CS)标号所在段的段地址  (IP)标号在段的偏移地址
push cs push ip jmp far ptr 标号
 
call 16位寄存器   (SP)=(SP)-2;   ((SS)*16+(SP)) = (IP) (IP)=(16位寄存器)
push ip  jmp  16位寄存器
 
call word ptr 内存单元地址
push ip  jmp  word ptr 内存单元地址
 
call dword ptr 内存单元地址
push cs push ip  jmp  word ptr 内存单元地址
 
ret   用栈中的数据修改IP 实现近转移           (IP) = ((SS)*16+(SP)) (SP)=(SP)+2;  POP IP
retf  用栈中的数据修改CS和IP 实现远转移       (IP) = ((SS)*16+(SP)) (SP)=(SP)+2   
                                              (CS) = ((SS)*16+(SP)) (SP)=(SP)+2;  POP IP   POP CS
 


使用call 和ret 设计子程序




mul指令(乘法)  8位或16位   8位一个默认放在AH,另一个放在8位寄存器或内存字节单元   结果放在AX
                          16位一个默认放在AX,另一个放在16位寄存器或内存字单元   结果高位放在DX ,地位放在AX
  MUL REG
  MUL 内存单元




div 除法








标志寄存器


1:用来存储相关指令的某些执行结果
2:用来为CPU执行某些指令提供相关依据
3:用来控制CPU的相关工作方式




存储的信息通常被称为程序状态字(PSW)


前面以学习13个 用来存放数据 都是按整个寄存器具有一个含义


标志寄存器(flag)是按'位'其作用 每一位有专门的作用


15 14 13 12 11 10 9  8  7  6  5  4  3  2   1  0 
            OF DF IF TF SF ZF    AF    PF    CF


1 3 5 12 13 14 15  8086cpu没有使用


CF  0 进位标志  无符号运算  最高有效为向跟高位进位值  或从更高的位借位值 
PF  2 奇偶标志  相关指令结束后结果的二进制数中的1个个数是否为偶数  偶数PF=1  奇数PF=0
ZF  6 零位标志  相关指令结束后结果是否为零  结果为零 则 ZF=1 否则ZF=0   1表示真
SF  7 符号标志  结果是否为负数  负数SF=1 非负数SF=0
OF  11 有符号溢出 
DF  10 方向标志位 在串指令中每次操作si,di 增减   DF=0(cld指令) 递增 DF=1(std指令) 递减   movsb  movsw  rep   




pushf  将标志寄存器值压入栈
popf




adc指令  带进位加法指令 利用CF进位的值


adc  操作对象1,操作对象2
操作对象1 = 操作对象1+操作对象2+CF


SSB
SSB  操作对象1,操作对象2
操作对象1 = 操作对象1-操作对象2-CF


CMP  比较指令  相当于减法指令,不保存结果  执行后对标志寄存器产生影响
CMP  操作对象1,操作对象2
     操作对象1-操作对象2   仅仅影响标志寄存器产生




内中断
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值