指令在内存中占一个字节,mov ax,bx占三个字节

汇编语言指令汇集及注意事项:
G:可以利用命令G+地址(下一条指令地址)跳到循环下一条指令的位置,

P:可以跳出循环。可以用命令u查看程序在内存存放的地址。也可以用p命令跳出循环,执行下一条指令。

d:命令可以查看内存情况,也可以d 1512:0000查看指定地址的内存情况;也可以(d 1512:0000 4)查看从1512:0000地址开始的连续4个内存单元的存储情况;

r:命令可以查看各个寄存器的情况
u:查看源程序;将寄存器中的机器指令翻译成汇编指令
e:在指定的内存地址中存放数据;如:e 2000:1000 23 42;将数据存放在2000:1000、2000:1001内存单元中
a:写入汇编指令
-------------
寄存器:
ax,bx,cx,dx代表通用寄存器
ds:代表数据的段地址,[0]代表数据段地址的偏移地址,[1],[2]......
cs:代表代码的段地址,
ip:代表代码的偏移地址
ss:代表栈的段地址
sp: 代表栈的偏移地址
-----------
指令:
mov ax,1;将数据1移动到寄存器中
add ax,2;寄存器ax中的数据与2相加,并将结果放入到寄存器ax中。
--
mov cx,3
s: add ax,ax
loop s
loop:循环指令
push:将数据压入栈顶;push ax;将寄存器中ax中数据送入到栈顶
pop:将数据从栈顶中取出;pop ax;将栈顶的数据从栈顶中取出,放入ax中
---------------
mov ax,2000h
mov ds,ax
设置程序中数据的段地址,不能直接使用mov ds,2000h,只能先将段地址存放到寄存器ax中,然后由寄存器ax送入到数据段地址寄存器ds中。
-----
mov ax,2000h
mov ds,ax
mov bx,6
mov al,[bx]
这里[bx]是代表偏移地址[6],不能直接在程序中使用mov al,[6],这样写的结果就是将6放入到寄存器al中,而不是将2000:0006h中内存单元中的数据放入到ax;
---------
一般程序 mov ax,2;2代表的是十进制的数;
如果要一个数值代表十六进制,就需要2h;
---------
程序中不能十六进制数不能以字母开头,比如
mov ax,ffffh,程序会报错,一定要在前面加数字,比如mov ax,0ffffh;这样就不会报错
---------
mul是乘法指令
1、两个相乘的数:要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在reg或内存字节单元中;如果是16位,一个默认在ax中,另一个放在16位reg或内存字单元中
2、结果:如果是8位乘法,结果默认放在ax中,如果是16位乘法,结果高位默认在dx中存放,低位在ax中放。
mul reg
mul 内存单元
mul byte ptr ds:[0] ;al中的值与内存字节单元的值相乘,存放在ax中。
mul word ptr [bx+si+8];ax中的值与内存字单元的值相乘,高位放在dx中,低位放在ax中
-----------
dec自减指令,inc自增指令;dec ax;inc ax;
--------
div指令是除法;一般都在ax中进行,除的商放在ax中,余数放在dx中;如div cx;cx为除数,
字节操作:16位被除数在AX,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。
字操作:32位被除数放在DX,AX中。其中DX为高位字,16位除数为源操作数,结果的16位端在AX中,16位余数在DX中
双字操作:64位被除数在EDX,EAX中,其中EDX为高位双字,32位除数为源操作数,结果的32位商在EAX中,32位余数在EDX中
--------------
转移指令
无条件转移指令:jmp s(跳转到s标号上)
有条件转移指令:jcxz s(当cx==0,跳转到s标号上)
循环指令:loop s(当cx==0,跳出s循环)
------------
call和ret指令都是转移指令,它们都修改IP或同时修改CS和IP。
-------------
1、ret和retf
ret指令用栈中的数据,修改IP的内容,从而实现近转移;
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;
CPU执行ret指令时,相当于:pop IP;将栈顶的值赋给IP
CPU执行retf指令时,相当于pop IP pop CS;
------
assume cs:code
stack segment
db 16 dup(0)
stack ends

code segment
mov,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
push ax
mov bx,0
ret
code ends
end start
上面程序,设置前两句是设置栈的段地址,将ax放入栈中,ret的命令是从栈顶中获取值(ax)=0赋予IP,这时的(IP)=0,下一条指令指向的是(IP)=0,指令的偏移地址为0,也是程序的第一条指令mov 4c00h,这是退出程序的指令
---------
assume cs:code
stack segment
db 16 dup(0)
stack ends

code segment
mov ax,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
push cs
push ax
mov bx,0
retf
code ends
end start
上面程序先设置栈的段地址、偏移地址;先将栈的段地址压入栈中,再将寄存器ax压入栈中,然后通过retf命令从栈中取出,先将寄存器ax(内容为0)从栈中取出,放入IP寄存器中,然后从栈中将cs取出放入寄存器CS中。这样下一条指令指向的段地址:偏移地址就是cs:ip;这里的(IP)=0
--------------
2、call指令
call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作
1、将当前的IP或CS和IP压入栈中
2、转移(jmp)
call指令不能实现短转移,
---
“call 标号":将当前的IP压入栈后,转到标号处执行指令;
功能:相当于执行标号,当执行完后可以从栈中取出call指令发出所在的IP地址,用作返回;比如说在一个方法中调用了另外一个方法,执行完方法后,返回继续执行当前方法剩下的程序。
call 标号:16位位移="标号"处的地址-call指令后第一个字节的地址
-------------
“call far ptr 标号"这种格式的call指令操作:
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 标号
---------
call word ptr 内存单元地址
汇编语法解释
push IP
jmp word ptr 内存单元地址
--------
call与ret结合使用
assume cs:code
code segment
start: mov ax,1
mov cx,3
call
mov bx,ax
mov ax,4c00h
int 21h
s: add ax,ax
loop s
ret
code ends
end start
上面程序分析:当程序执行到call时,会将call下面一条指令的IP地址压入栈中,接着跳转到标号s程序处,执行循环操作,当(cx)=0跳出循环,ret指令将栈顶元素赋给寄存器IP,程序的指令会执行CS:IP处,这里就是mov bx,ax;(bx)=8,然后执行结束指令,结束程序;
------------
显存的操作:

 

posted on 2019-05-25 21:14  lazyli  阅读(407)  评论(0)    收藏  举报