[关闭]
@2017libin 2019-06-30T16:03:38.000000Z 字数 1866 阅读 106

《汇编那些不得不知的东西》

汇编


入门须知

  1. 两个操作数的字长要求一致
  2. 两个操作数不能同为M,不能同为段R(PUSH、POP、MOVS、CMPS除外)
  3. 目的操作数不能取立即数
  4. 十六进制数以字母开头时,需要在前面加0,以示与符号、助记符、变量名、标号等区别
  5. 传送指令绝大部分不影响标志位(除SAHF、POPF外)。主要是算术、逻辑运算指令影响标志位
  6. 绝大部分指令不用段R(MOV、PUSH、POP除外)。
  7. 多字节存储:使用小端方式,低对低高对高。
  8. 存储器操作数可以是字节、字、双字,类型不确定,需要用PTR说明。也就是说使用[]访问存储器时,需要用ptr指定数据类型。例如 word ptr [1000]
  9. 物理地址 = 段地址16 + 偏移地址,一个物理地址对应着多个逻辑地址
  10. 透明寄存器不能直接修改,必须使用特定的指令。常见的透明寄存器有CS, IP, FLAGS
  11. 1字节数据范围:-128~127,2字节数据范围:-32768~
  12. ? 表示占位符,数值未知
  13. 20位的段地址都是16的倍数,省略了后四个0,所以就用16位来表示一个段地址
  14. IF=1允许中断
  15. CF表示的是无符号数相加是否超出范围,结果正确。OF表示的是有符号数相加是否超出范围,结果错误。
  16. 寄存器和变量长度不一样,强制转换为寄存器的长度。这就说明[]和寄存器一起操作可以不用指明类型。
  17. word ptr wavr+1表示word ptr [wavr+1]
  18. 数据段里面的数组可以用[]进行元素的访问。
  19. MOV 的七种错误语法:m->m, s->s, i->s, 以及四种立即数作为目的操作数的情况。
  20. DATA SEGMENT 中的DATA是立即数寻址,DATA SEGMENT里面的变量在DATA SEGMENT 里面是立即数寻址,在代码段是存储器寻址。
  21. 1MB可以分为大小为16B~64kB的存储空间,段地址最低为0000H
  22. cwd指令只能用在乘除上面
  23. 数据表达式只能用在常量相加,例如,bx+di是错误的常量表达式。(这里相当于是r+i)
  24. 两种等价的定义:b dw '1','2','3' 和 b dw '123'
  25. 负数的存储是使用补码形式
  26. 常用的字符ascll,a~z:61h~7ah,A~Z:41h~5ah,0~9:30h~39h,空格:0dh,换行:0ah
  27. 压缩BCD码是用四位2进制来表示一位十进制,非压缩BCD使用八位2进制

程序格式

  1. data segment
  2. ;数据段定义
  3. data ends
  4. code segment
  5. assume cs:code, ds:data
  6. start: mov ax,data
  7. mov ds,ax
  8. ;代码段定义
  9. mov ah,4ch ;程序执行结束,返回DOS界面
  10. int 21h
  11. code ends
  12. end start
  13. ;普通子程序定义
  14. 子程序名 PROC
  15. ...
  16. ret ;程序返回
  17. 子程序名 EDNP
  18. ;中断服务子程序定义
  19. 子程序名 PROC
  20. ...
  21. iret ;中断子程序返回,注意和普通子程序的ret区分
  22. 子程序名

常用的指令

  1. ;数据传送
  2. MOV ;记住七种不合格指令
  3. OFFSET
  4. POP/PUSH ;堆栈操作指令
  5. IN al/ax, i8/dx ;读IO端口,端口号为i8/dx,两种寻址方式分别为直接寻址和寄存器间接寻址
  6. OUT i8/dx, al/ax ;写IO端口
  7. ;数值运算
  8. NEG r/m ;取反指令,相当于正负转换
  9. ADD
  10. ADC ;带进位加法
  11. SUB
  12. CMP dest,src ;结果不送回,但影响标志位
  13. INC ;自增,影响除了cf以外的标志位
  14. DEC
  15. ;位操作指令
  16. AND
  17. OR
  18. XOR
  19. TEST
  20. ;允许和禁止可屏蔽中断
  21. STI ;允许
  22. CLI ;禁止
  23. ;移位指令
  24. SHL ;逻辑左移,reg/mem左移1/cl位,最低位补零,最高位进入cf
  25. SHR ;逻辑右移,reg/mem右移1/cl位,最高位补零,最低位进入cf
  26. ROL ;不带进位的循环左移
  27. ROR ;不带进位的循环右移
  28. ;跳转指令
  29. JMP ;无条件跳转
  30. LOOP ;循环
  31. JC ;有进位或者借位,常和CMP连用
  32. JE/JZ ;等于零(相等),常和TEST以及CMP连用
  33. call ;中断子程序的调用
  34. 9 dup(0) ;重复写90

不常用指令

  1. ;无符号数比较BELOW,ABOVE
  2. JB
  3. JNB
  4. ;有符号数比较GREATER,LESS
  5. JL
  6. JNL
  7. XCHG ;交换指令
  8. XLAT ;[al+bx]->al

疑惑点

  1. 可以放在[]的寄存器:[BX],[SI],[DI],[SP]
  2. 存在有偏移地址的寄存器可以看是立即数寻址?
  3. 汇编程序中指令和变量大小写都不区分?
  4. = 和 equal 谁不可以使用常量表达式
  5. 符号扩展和乘除指令的使用
  6. NOT和NEG操作的结果是否一样
  1. data segment
  2. buf db 10,11,12
  3. b1 dw 10,seg buf, buf ;后面这两个到底写了什么?
  4. data ends
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注