汇编学习笔记(二)

2019-12-24  本文已影响0人  Jesse_996

debug 用法

1.查看、修改 cpu 中寄存器的内容:R
2.查看内存中的内容:D
3.修改内存中的内容:E(可以写入数据、命令,无区别)
4.将内存中的内容解释为机器指令和对应的汇编指令:U
5.执行 CS:IP 指向的内存单元的指令:T
6.以汇编指令的形式向内存中写入命令:A
7.G命令可以直接让IP跳到指定位置,如g 0012,会使IP跳到0012的位置。
8.用p命令可以从循环中一次循环完。也可以用g命令,直接跳到指定位置。

(T命令在执行修改寄存器SS的指令时,下一条指令也紧接着执行)

寄存器(内存访问)

字单元:存放一个字型数据(16 位)的内存单元,由两个地址连续的内存单元组成。高地址存高位字节,低地址存地位字节。

DS 和[address]

DS 通常用来存放要访问数据的段地址。

将 10000H 中的数据读到 al 中 :

mov bx,1000H
mov ds,bx
mov al,[0]

mov 指令中的[]说明操作对象是一个内存单元,[]中的 0 说明偏移地址是 0,段地址默认是 ds。8086cpu 不支持将数据直接送入段寄存器,而是要用一个寄存器中转,即mov ds,1000H是非法的。

addsub对段寄存器都是非法的,即add ds,ax,add ds,1,add, ds,[1]都是非法的。

综上,段寄存器的相关操作有:

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

即段寄存器可以用 mov 与寄存器和内存单元进行操作(不能与数据),不能用addsub

push入栈,pop 出栈,如push ax,pop ax
SS:SP用来指向栈顶元素。

入栈过程
如图,8086入栈时,栈顶从高地址向低地址方向增长。因为任意时刻SS:SP指向栈顶,所以当栈为空时,SS:SP指向栈的最底部单元下面的单元。

pop与push相反


出栈过程

8086不保证我们对栈的操作不会过界,我们只能自己注意。
push和pop操作形式有如下几种:

push 寄存器/段寄存器/内存单元
pop 寄存器/段寄存器/内存单元

段是我们人为规定的。

一段内存可以既是代码段又是数据段,又是栈段,也可以都不是。这取决于CS、IP、SS、SP、DS的指向。

第一个程序

汇编语言源程序包含两种指令:
1.汇编指令:有对应机器码,可以被编译为机器指令,最终被cpu执行。
2.伪指令:没有对应机器码,不被cpu执行,由编译器来执行。

assume cs:abc
abc segment
    mov ax,2
    add ax,ax
    add ax,ax
    mov ax,4c00H
    int 21H
abc ends
end

segment

segmentends是一对成对使用的伪指令,是必须要用到的一对伪指令,用来定义一个段,使用格式为:

段名 segment
..
段名 ends

一个汇编程序由多个段组成,这些段用来存放代码、数据或当做栈空间。一个有意义的汇编程序必须要有一个代码段。

end

end是会变程序结束的标记,不要搞混endendsends是和segment成对使用的。

assume

这条伪指令含义是“假设”,它假设某一段寄存器和程序的某一个用segment...ends定义的段相关联。只要记住assume是将有特定用途的段和相关联的段寄存器关联起来即可。
比如,用cname segment... cname ends定义了一个名为cname的段,在程序开头,用assume cs:cnamecname段和cs联系起来。

程序返回需要使用以下2条语句:

mov ax,4c00H
int 21H

loop

作用是循环,cpu执行loop的时候,进行2部操作:
1.(cx)=(cx)-1
2.判断cx中的值,不为0则转到标号处执行,否则向下执行

上一篇下一篇

猜你喜欢

热点阅读