回头看了下汇编,简单总结一些备忘,大部分内容在《王爽汇编语言第二版》中有更为详细的介绍,建议下载,比起某些教授抄书出版的内容,王爽先生的文章何止优秀百倍
mov
(1)数据送寄存器;
(2)寄存器送寄存器;
(3)内存单元送寄存器;
注意:
1.内存不能送内存
2.内存不能送段寄存器;
例:
将al中的数据送入内存单元10003H
分析:默认数据的寄存器是DS,所以只要我们设置ds的值后,使ds*16+[数据索引] = 10003即可。
程序:
mov bx,1000H
mov ds,bx
mov [3],al
另一种答案:
mov bx,FFFH
mov ds,bx
mov [13],al
PUSH(入栈)
POP (出栈)
push ax:将寄存器ax中的数据送入栈中;
pop ax :从栈顶取出数据送入ax。
8086CPU的入栈和出栈操作都是以字为单位进行的
jmp short 标号
(IP)=(IP)+8位位移。
jmp near ptr 标号
它实现的是段内近转移。
指令“jmp near ptr 标号”的功能为:
(IP)=(IP)+16位位移。
jmp far ptr 标号
实现的是段间转移,又称为远转移
(IP)=(IP)+32位位移。
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
执行后,(IP)=0123H
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
执行后,(IP)=0123H
ret 和retf
ret
将栈中数据pop至IP中,具体操作如下:
(IP)=((ss)*16+(sp))
(sp)=(sp)+2
将栈中sp指针处的值放入到IP中,同时栈指针往栈底移动两byte(栈是从高位往地位分配的,所以取出一个数据要增加2)
retf:(return far)
(IP)=((ss)*16+(sp))
(sp)=(sp)+2
(CS)=((ss)*16+(sp))
(sp)=(sp)+2
call指令 (一般和ret配合使用)
call 标号(将当前的 IP 压栈后,转到标号处执行指令)
CPU执行此种格式的call指令时,进行如下的操作:
(sp) = (sp) – 2
((ss)*16+(sp)) = (IP)
(IP) = (IP) + 16位位移
16位位移=“标号”处的地址-call指令后的第一个字节的地址;
16位位移的范围为 -32768~32767,用补码表示;
16位位移由编译程序在编译时算出
call相当于:
push IP
jmp near ptr 标号
call far ptr 标号:
(1) (sp) = (sp) – 2
((ss) ×16+(sp)) = (CS)
(sp) = (sp) – 2
((ss) ×16+(sp)) = (IP)
(2) (CS) = 标号所在的段地址
(IP) = 标号所在的偏移地址
相当于进行:
push CS
push IP
jmp far ptr 标号