汇编 备忘录

  1. 使用MASM32链接程序时,如果出现错误为未定义程序入口点,则通过link程序的/ENTRY:label指定程序的入口点地址,其中label就是程序中定义的入口点地址的符号。

 

  2. 在WIN7下,编译生成的可执行程序使用debug [程序名]装入内容并调试后,我编写的汇编代码从地址0BA4:01C0开始,不知道为什么,按某些书上的说法应该是从CS:IP开始就是我的代码,似乎WINDOWS加入了一些他们的代码。

 

  3. 最后还是要使用MASM 5.0,该版本针对DOS的汇编程序,不涉及32位程序,因此符合大多数汇编教学书上的模式。

 

  4. 汇编中,数字不能以字母开头,所以对于ffffH这个数值,要写成0ffffH。

 

  5. debug程序中,比较有用的命令:

    -g 偏移地址   //跳转到编译地址指定的代码,之前的代码会一次性被执行

    -d 段地址:起始偏移地址  结束偏移地址  //转储(dump)出指定内存空间的数据

    -u 段地址:起始偏移地址  结束偏移地址  //反汇编指定内存空间的数据成为汇编代码

    -r //列出当前所有寄存器保存的数据

    -p //遇到loop指令时,会一次过执行完全部循环

 

  6. 在debug程序中,像mov al,[123] 这样的汇编代码其最后执行结果是:以把内存中ds:123的单元的数据读入到寄存器al中;但如果在常规的汇编编译器中,这样的指令却表示把常数123保存到寄存器al中。因此在常规汇编编译器中要达到同样的效果,有两种方式:

    1) mov bx,123

      mov al,[bx]

    2) mov al, ds:[123] //这种方式称为段前缀方式,使用段前缀就不再局限只能使用DS作为数据段的段寄存器。

 

  7. 汇编代码最后的end,如果后面带一个标号,例如 end start,则指明该汇编程序的入口点为start,使得程序在载入时设置cs:ip到start所在的地址。如果不这样指定入口点,则汇编程序默认从cs段起始地址开始执行。

 

  8. 16位汇编中,静态分配段的大小若小于16字节,也会默认分配16字节。

 

  9. 8086汇编语法支持以下寻址方式

    [bx]、[si]、[di]、[bp]

    [bx+si]、[bx+di]、[bp+si]、[bp+di]

    [bx+si+立即数]、[bx+di+立即数]、[bp+si+立即数]、[bp+di+立即数]

 

    bx与bp不能同时出现,si与di不能同时出现。其他寄存器不能用于寻址;bx默认对应于ds段寄存器,bp默认对应于ss段寄存器

  10. 汇编中的多重嵌套循环,由于loop只使用CX做计数值的寄存器,因此在每次进入一重循环,就应该把相对的外层循环的CX值入栈,然后赋予CX内循环的循环计数值;当内循环完成,就出栈外循环的CX值,然后再执行loop指令。如此处理就可应对N重嵌套循环。

 

  11. 汇编指令中,一般通过操作的寄存器大小决定操作数据的长度,如果不存在寄存器,那么就可以通过word ptr或byte ptr决定是以字还是字节为单位操作。例如

    mov byte ptr ds:[bx] , 1

    inc word ptr ds:[0002H]

 

  12 8086中,div指令的情况:

           除数8位    除数16位

    被除数取自  AX      AX和DX(DX保存高16,AX保存低16)

    商      AL      AX

    余数     AH      DX

 

  13 汇编中的loop和jcxz是恰好相反的一对转移指令,前者当cx不为0时跳转到指定目标,后者当cx为0时跳转。

 

  14 ret指令的行为:pop IP;retf指令的行为:pop IP , pop CS

     call指令的行为:push IP; call far ptr指令的行为:push CS, push IP

 

  15 inc指令不会对CF位产生影响

你可能感兴趣的:(汇编)