zoukankan      html  css  js  c++  java
  • 汇编1

    mov bx,1000H
    mov ds,bx
    mov al,[0]
    以上三条语句目的是读取10000H单元的内容放到al中
    ds寄存器通常用来村发给你要访问数据的段地址
    []中的数字表示内存单元的偏移地址
    注意不能直接吧数据送入段寄存器中,例如ds等,所以这里先把数据送入bx,然后再把bx送入ds

    mov 寄存器,数据
    mov 寄存器,寄存器
    mov 寄存器,内存单元
    mov 内存单元,寄存器
    mov 段寄存器,寄存器
    移动第二个位置的数据到第一位
    sub(减去) 和add(加上)跟mov差不多,其结果放在第一个的位置上

    栈(LIFO后进先出,入栈是,栈顶从高地址想低地址方向增长):
    push ax 将寄存器ax的内容送入栈中
    pop ax 从栈顶取数据送入ax
    栈顶的段地址放在SS中,偏移地址存放在SP中,任意时刻,ss:sp指向栈顶元素
    注意栈顶超出栈空间问题,push会导致栈顶超界,pop也会
    pop 段寄存器
    push 段寄存器
    pop 内存单元
    push 内存单元

    怎么设置数据段,代码段,栈段呢
    数据段:把段地址放在ds中,偏移地址放在[]中
    代码段:把段地址放在cs中,偏移地址放在ip中
    栈段:把段地址放在ss,偏移地址房子啊sp中

    inc bx 指bx中的内容加1,相当于c语言的自增

    loop 该指令用来实现循环功能,循环次数放在cx中,执行一次命令后,cx减1,然后判断cx是否为0,不为0转至标号处继续循环,否则退出该循环向下执行
    上个例子吧

    [02:56:33] vi a.asm
    [02:56:46] nasm -g -f elf64 a.asm
    [02:56:56] ld -o a a.o
    [02:57:01] gdb a
    GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-redhat-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /root/bp/asm/a...done.
    (gdb) l
    1   section .text
    2   global _start
    3   _start:
    4       mov eax,4
    5       mov ebx,1
    6       mov edx,1
    7       mov ecx,10
    8       s: add edx,edx
    9          loop s
    10      mov edx,0
    (gdb) 
    11      mov edx,20
    12      int 80H
    13      mov eax,1  ;用于退出程序的linux内核命令号,即系统调用
    14      mov ebx,0  ;程序返回码,改变这个数会改变echo $?的值
    15      int 80H ;用来唤醒内核
    (gdb) b 10
    Breakpoint 1 at 0x400098: file a.asm, line 10.
    (gdb) b 11
    Breakpoint 2 at 0x40009d: file a.asm, line 11.
    (gdb) r
    Starting program: /root/bp/asm/a 
    
    Breakpoint 1, 0x0000000000400098 in s ()
    (gdb) print $eax
    $1 = 4
    (gdb) print $edx
    $2 = 1024
    (gdb) 
    

    我试过cx和ecx,结果都是正确的,注意是add edx,edx,所以结果才会这么大,懒得改成累加1到10了。bty,我还没搞清楚什么时候该用什么寄存器,所以就先随便用了,其它几个语句我也暂时不知道为什么要那么写

  • 相关阅读:
    js分页--存储数据并进行分页
    纯CSS多级菜单
    ini文件操作
    XML文件数据操作
    身份证号码验证
    将DataSet(DataTable)转换成JSON格式(生成JS文件存储)
    将JSON(List集合)转成DataSet(DataTable)
    js打印(控件)及多种方式
    了解切面编程思想
    20190429版本-测试过程回溯
  • 原文地址:https://www.cnblogs.com/biaopei/p/7730649.html
Copyright © 2011-2022 走看看