zoukankan      html  css  js  c++  java
  • 汇编语言读书笔记(二)

    关于本次阅读后的思考

     第三章

    1 DS 数据段寄存器一次读取2个存储单元,CS是指令段寄存器

    2 栈是先进后出,栈寄存器SS:SP 每次都是先进行SP+-=2 然后再进行PUSH或者POP的,切记先SP计算

    3 栈其实也是一种写入数据的方式,可以理解为MOV,只不过SS:SP默认会有内存地址。

     第四章

    1 下载MASM5.0工具,

    执行masm.exe后关联上源文件生成.OBJ文件

    执行link.exe后关联上刚生成的OBJ文件生成.EXE文件

    执行.EXE文件

    edit--test.asm----masm---test.obj----link----test.exe----run

    2 通过DEBUG FILE执行单步调试

    指令 -t

    当int 21h时使用-p结束

    第5、6章

    代码的框架

    assume cs:code
    
     code segment
        dw XXXXXXXXXXXXXXXXXXX  //数据层
    ..........
    ....... start : mov XXX //start 告知执行代码的入口 mov XXXX //代码层 mov XXXX mov ax,4c00h //结束写入 结束程序的时候默认写法 int 21h //结束程序的时候默认写法 code ends end start //代码结束的地方

    第三章 寄存器

    字是16位的所以在内存中需要2个单元来存放,且寄存器的高位对应高位地址,低位对应低位地址

    DS寄存器

    数据段地址寄存器

    1 DS不能直接被送入数据,必须通过其他寄存器进行中转

    例如 mov bx,1000h

          mov ds,bx

          mov al,[0] ---0处写偏移地址[]代表ds的段地址

    指令 POP PUSH 

    PUSH AX 表示把AX的值送入栈中

    POP AX  表示把栈顶的值送入AX中

    PUH/POP 寄存器/段寄存器/内存单元

    栈是先进后出机制,以字为单位

    栈地址是由高向低扩展

    栈的寄存器

    SS,SP

    SS指向栈的段地址SP指向栈的偏移地址,永远指向栈顶sp+=2(注意:是先SP+-再PUSH或者PHP)

    SS必须通过一般寄存器中转后送入值

    如果000F为栈底,那么初始化的时候SP指向0010,有一个元素的时候是000E

    个人理解

    1 DS是数据段寄存器,一次读取2个存储单元

    2 栈是先进后出,栈寄存器SS:SP 每次都是先进行SP+-=2 然后再进行PUSH或者POP的,切记先SP计算

    3 栈其实也是一种写入数据的方式,可以理解为MOV,只不过SS:SP默认会有内存地址。

    第四章 汇编程序

    指令:

    伪指令不被系统执行

    汇编指令被翻译成机器代码被执行

    简单代码

    assume cs:abc
    
    abc segment 
    
        mov ax,2
        add ax,ax
        add ax,ax

    mov ax,4c00H
    int 21H abc ends end

    执行源程序

    1 通过MASM5.0执行

    edit--test.asm----masm---test.obj----link----test.exe----run

    2 通过DEBUG FILE执行单步调试 -t 当int 21h时使用-p结束

    个人理解

    1 下载MASM5.0工具,

    执行masm.exe后关联上源文件生成.OBJ文件

    执行link.exe后关联上刚生成的OBJ文件生成.EXE文件

    执行.EXE文件

    edit--test.asm----masm---test.obj----link----test.exe----run

    2 通过DEBUG FILE执行单步调试

    指令 -t

    当int 21h时使用-p结束

    第五、六章 汇编程序II

    LOOP指令

    执行和CX有关,每次执行都会(CX)=(CX)-1

    语法是先制定一个地址S:XXXXXX  LOOP S 

    要点 CX决定+LOOP决定循环 S标记循环的地址

    mov cx 11

    s: add ax,ax

        add ax,bx

    loop s

    以上程序执行11次

    [BX]

    这个指令由于DEBUG和MASM解释的有歧义

    MOV AX,[0] DEBUG是将DS:0的值放入AX,MASM则是把0送入AX

    所以写编码的时候用 MOV AX,DS:[0] 

    例1

    累加5个数字

    0123H,123H,312H,2131H,231H

    assume cs:code
    
     code segment
        dw 0123H,123H,312H,2131H,231H   //在代码的初始位置上先定义数据,试数据能够初始化在0.2.4.6
    start : mov ax,0 //start 告知执行代码的入口
    mov bx,0
    mov cx,5
    s: add ax,cs:[bx] //AX累加CS指向的0.2.4.6
    add bx,2
    loop s
    mov ax,4c00h //结束程序的时候默认写法
    int 21h //结束程序的时候默认写法
    code ends
    end start //代码结束的地方


     个人理解 

    代码的框架

    assume cs:code
    
     code segment
        dw XXXXXXXXXXXXXXXXXXX  //数据层
    ..........
    ....... start : mov XXX //start 告知执行代码的入口 mov XXXX //代码层 mov XXXX mov ax,4c00h //结束写入 结束程序的时候默认写法 int 21h //结束程序的时候默认写法 code ends end start //代码结束的地方
  • 相关阅读:
    索引器
    异常
    C#各版本
    构造函数
    值类型和引用类型
    面向对象聊天机器人
    linux 系统快捷键
    linux 系统常用设置
    linux 系统介绍
    linux 命令学习.txt
  • 原文地址:https://www.cnblogs.com/sunfan1988/p/3537439.html
Copyright © 2011-2022 走看看