汇编笔记2(编程)

第4章(第一个程序):

用到的工具:MASM.exe  LINK.exe

伪指令:编译器处理

例:

    assume cs:codesg(定义一个代码段名称)

    codesg segment(代码段) 

    start: 汇编语句

    codesg ends(配合结束)

    end

assum假设关联

start :入口(可以自己命名)

编译->可执行文件(pe)

int  中断

结束:

    程序返回:mov ax,4c00        int  21

    段结束:ends

    程序结束:end

加分号可以不用设置过程

编译:masm 文件名(加分号可跳过中间过程)

连接:link 文件名(obj文件,加分号可跳过中间过程)

简单方法:ml 文件名(编译并连接)(要有ml.exe)

psp:存放dos和程序交互命令100H,ds偏移psp后是cs:ip

另:1.dos是单任务操作系统

        2.dos修改了CS:IP使程序运行

      3.debug装入内存会在cx中存储长度

实际操作遇到的问题:

    1.non-digit in number:应当在十六进制数后加H

    2.debug默认十六进制。

第5章([bx]和loop循环):

[bx]指令:主要因为在文本编辑和debug中不一样,文本编辑中[常数]相当于常数,所以要先存到bx才表示偏移地址。

():描述符号,表示括号内的内容

idata:描述符号,表示一个常量

loop和cx:loop循环直到cx减为0(通常)

loop语句用法:跳转到s标签循环.(在之前设置s标签(s:代码))

编程考虑过程:是否安全(存放位置)->是否能存下结果->初始化(ds,cx,ss等)->调用循环->结束

段前缀:显式给出段地址(cs: ds: ss:)(ds寄存器的作用可以用es:[ ]替代)

安全空间(底层而不冲突的空间):0:200~0:2ff

另:1.执行循环最好把mov cx ,idata放在要循环的部分前

        2.汇编源程序中数据不能以字母开头,在前面加0

        3.不同段可以再用一个段寄存器

编程中的问题:

        1.loop语句在要循环的语句之后

        2.源程序中地址表示形如ds:[idata]

        3.注释采用';'

第6章(多个段的程序):

解决的问题:既要有代码又有数据

1.不使用多个段:

例:

assume cs:code

code segment

          dw 123ah,34d3H

start:mov ax,cs;设定栈

        mov ss,ax

        mov sp,0004;偏移地址为dw之和(因为数据从0开始所以直接相当于dw长度和)


        mov bx,0

        mov ax,4c00h

        int 21h

code ends

end start

db :定义字节型数据(8)--->dw:定义字型数据(16)--->dd:定义双字结构(32)

        既可以用来设置内存值,又可以用来分配内存。

直接放在代码段,段地址CS,偏移地址在最开始为0

设定start(见前面)入口使cpu区分数据和代码。--->end可以通知入口是谁

2.使用多个段:

assume cs:code,ds:data,ss:stack

data segment

          dw 1234h,2334h

data ends

stack segment

        dw 0,0,0,0,0,0,0,0

stack ends

code segment

start: mov ax,stack;stack,data,code都是存有段地址的常量

        mov ss,ax

        mov sp,10h;stack段的dw之和

        mov ax,4c00h

        int 21h

code ends

end start

另:

        1.不同段段地址相差至少1

实验暴露的问题:

        1.段地址是10倍

        2.loop后面要跟段标签

        3.不能直接把段标签拿来用,要放到段寄存器里才能用

你可能感兴趣的:(汇编笔记2(编程))