博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编第三日
阅读量:4647 次
发布时间:2019-06-09

本文共 1912 字,大约阅读时间需要 6 分钟。

在.asm文件中写mov al, [0],对于编译器来说只是将0赋值给al(不过写[0]相当于写ds:[0],写[1],[2]....这些就不相同了)

 

为了表示我们想要的ds:[0]:

1.改写成mov al, ds:[0]

2.

mov bx, 0

mov al, [bx]

所以bx寄存器基本上与内存地址挂钩

 

cx寄存器基本上记录loop循环次数,也可记录源代码行数

 

loop基本语法:

      mov cx, 11

标号:循环体

      loop 标号                ;这三条语句尽量靠近,防止其他语句对寄存器值进行修改

 

loop执行过程:

    (cx) = (cx) - 1      //寄存器外加个"(  )"表示寄存器的内容,为了更好表示寄存器

    若(cx)不为0,跳转到标号执行;若为0,执行loop下一条语句

 

编写汇编代码时,若想表示16进制数据,在数据后加上'H'  或  ‘h’,并且数据不能以字母开头,例如FFFFH只能写成0FFFFH.

 

add ax, ax :表示幂的计算

add ax, data :表示乘法的计算

 

对于8位数据与16位寄存器数据相加,结果放在寄存器中

首先8位数据无法直接使用 add 来与16位数据相加,所以8位数据先放到充当中介作用的寄存器的低8位,高8位置0,之后和16位寄存器相加即可

实现局部代码:

mov bx, 0    mov cx, 12s:  mov al, [bx]    mov ah, 0    add dx, ax    inc dx    loop s

inc:(bx) = (bx) + 2

;封号作为注释

 

段前缀概念:

mov ax,cs:[0]/ds:[0](ds和cs即为段前缀)

       

一般PC中,0:200 --- 0:2FF为安全空间即不干扰OS运行

 

可以情况下,ds:[...]化一下更为简单,例如 200:100 - 200:1FF  可以化成  210:0 - 210:FF等等

 

dw指令和db指令:

dw:define word 定义字型数据

db:define byte 定义字节数据

 

dw语法:

dw 0102H,0304H,0506H

0102H占了一个字(两个内存存储空间)

 

一旦出现dw和或db,那么定义标号就很有必要。之前没有定义dw或db时,没有定义标号是不影响程序执行和结果,虽然报个warning:没有程序入口地址;但是定义了dw或db时,若没有标号,那么当汇编指令转化成机器指令时,CPU从伪指令之后的第一行指令开始执行,会认为用户定义的数据也为指令,从而执行出错。所以要注明标号指明程序入口地址。

但是有个特殊点:当我们把汇编指令写为第一个段db或dw定义在其后的话,CPU还是从第一段指令开始执行,直到end结束执行,结果依然正确

 

汇编指令结尾end作用:

1.通知编译器程序结束

2.得到程序入口地址(真正执行机器指令时,CPU会先去找end,从而根据其后的标号找到程序入口地址)

 

若数据或指令需要大于64KB(8086:一个段最大容量)时,需要多个段空间来执行,主要是封装的思想,毕竟64KB比较大,而之后的i386的32位对应最大段容量为4GB

实例:

assume cs:code,ds:data,ss:stack //将地址与相应的寄存器挂钩data segment         dw 0123h,0456hdata ends stack segment         dw 0,0stack ends code segment start:  mov ax,stack           mov ss,ax    //也无法给ss         mov sp,16         mov ax,data //同理标号data为数据无法直接给ds        mov ds,ax         push ds:[0]         push ds:[2]         pop ds:[2]         pop ds:[0]         mov ax,4c00h         int 21h code ends end start

 

ES为附加段寄存器

 

当可执行文件加载进内存时,CS:IP会被设置成end 标号对应的程序入口地址,从而开始执行第一条指令

 

CPU靠CS:IP,SS:SP,DS:[...]来认识代码段,栈,数据段

 

           Done!!!                 

转载于:https://www.cnblogs.com/chaunceyctx/p/7282611.html

你可能感兴趣的文章
实验六--静态路由
查看>>
PLSQL DBMS_DDL.ANALYZE_OBJECT
查看>>
对Dataguard的三种模式的理解
查看>>
网络原理
查看>>
JS学习笔记
查看>>
写日记的好处
查看>>
扩展欧几里得(手推)
查看>>
火星人
查看>>
2017-10-5 清北刷题冲刺班p.m
查看>>
bzoj 2844: albus就是要第一个出场
查看>>
XSS跨站脚本与CSRF跨站请求伪造
查看>>
分享20个最新的免费 UI 设计素材给设计师
查看>>
[Dynamics CRM 2016]如何配置多语言显示
查看>>
【面试】http协议知识
查看>>
mysql 运维常见操作
查看>>
python学习笔记11 ----线程、进程、协程
查看>>
MySQL查询今天/本周/上周/本月/上个月份的数据
查看>>
VS2010单元测试(转)
查看>>
WPF 四种尺寸单位
查看>>
ViewStub的应用场合
查看>>