zoukankan      html  css  js  c++  java
  • 汇编笔记(1) 寄存器

    Debug

    r:查看当前所有寄存器的值;也可以通过r <寄存器名称>来修改寄存器的内容。

    d:查看内存内容,例如 -d 1000:0 8 查看段地址为1000,偏移地址为0,8个字节长度的内存内容。

    e:直接修改内存内容:16进制

    u:也是查看内存内容,但是会翻译成汇编指令显示出来,而不是16进制内容

    a:直接修改内存内容:汇编指令

    t:单步执行指令

    p:跳出循环,比如loop和系统终端,也可以通过g指定一个偏移地址来直接执行到某个指令。

    寄存器

    CS:代码段地址,通过与IP(偏移地址)的配合形成20位的实际代码物理地址。CS:IP指向CPU当前执行的指令。

    DS:数据段地址,通过手动指定偏移地址共同确定数据的物理地址;DS不能直接设置,需要通过其他寄存器来进行赋值。

    SS:SP确定栈顶位置;push和pop指令执行时会根据SS:SP去确定栈顶位置。CPU不知道栈满和栈空,需要程序员自己管理。

    CX:存放循环次数,与loop指令配合使用。

    编程注意

    MASM中的数值默认是十进制,如果要写16进制的必须用0开头或者h结尾,十六进制的2000要写成2000h。

    debug中都是十六进制的,所以可以直接写十六进制数值就行了,例如2000,

    [bx]

    在debug中可以通过

    mov ax,[0]

    来读取内存中的内容到寄存器。但是在MASM只能通过下面这样才可以:

    mov bx,0
    mov ax,[bx]

     或者下面这样也行:

    mov ax,ds:[0]
    mov bx,ds:[1]
    mov cx,ds:[2]
    mov dx,ds:[3]

    代码示例

    ;计算0ffff:0 ~ 0ffff:b十二个字节单元的内存值的和,存放到dx中
    assume cs:code code segment ;代码段,code是代码端的名称。一个程序可以有很多代码段 start:mov ax,0ffffh mov ds,ax ;往ds中写数据需要借助其他寄存器,ds:数据段地址 mov dx,0 mov cx,12 ;cx存放的是loop循环的次数 s:mov bx,0 ;s为标号 loop可跳转到标号 mov al,[bx] mov ah,0 add dx,ax inc bx loop s ;每次循环完之后会自己递减cx,直到cx为0 mov ax,4c00h ;这两句是标准的程序退出语句 int 21 code ends ;代码段结束 end start ;end为程序结束,start为程序入口

    安全空间

    0:200 ~ 0:2ff

  • 相关阅读:
    Leetcode题目:Remove Duplicates from Sorted List
    Leetcode题目:Lowest Common Ancestor of a Binary Search Tree
    Leetcode题目:Ugly Number
    Leetcode题目:Remove Linked List Elements
    Leetcode题目:Count and Say
    6-3 事务
    6-1 视图
    5-2 pymysql模块
    5-1 图形工具Navicat
    4-3 多表查询
  • 原文地址:https://www.cnblogs.com/at0x7c00/p/8857708.html
Copyright © 2011-2022 走看看