• 第三章 汇编语言基础


    3.2整数相加减

    TITLE Add and Substract;TITLE整行注释
    ;author:Hk_Mayfly
    ;date:2019/09/06
    
    INCLUDE Irvine32.inc;调用函数
    
    .code;代码段
    main PROC;PROC标识一个过程的开始(相当于标志一个函数定义的开始)
        mov eax,10000H;
        add eax,20000H
        sub eax,10000H
    
        call DumpRegs;调用一个显示CPU寄存器值的过程
    main ENDP;和16位code ends类似,ENDP表示结束一个过程
    END main;和end start类似,表示汇编程序结束,main标号标识了过程的入口地址

    TITLE Add and Substract;TITLE整行注释
    ;author:Hk_Mayfly
    ;date:2019/09/06
    
    INCLUDE Irvine32.inc;调用函数
    
    .386;程序要求的最低CPU
    .model flat,stdcall;.model为保护模式程序生成代码
    .stack 4096;
    ExitProcess PROTO, dwExitCode:DWORD
    DumpRegs PROTO;PROTO声明了该程序使用的过程原型,相当于函数声明
    
    .code;代码段
    main PROC;PROC标识一个过程的开始(相当于标志一个函数定义的开始)
        mov eax,10000H;
        add eax,20000H
        sub eax,10000H
    
        call DumpRegs;调用一个显示CPU寄存器值的过程
        INVOKE ExitProcess,0;返回0,相当于函数调用
    main ENDP;和16位code ends类似,ENDP表示结束一个过程
    END main;和end start类似,表示汇编程序结束,main标号标识了过程的入口地址

    3.3 汇编链接执行周期

    3.4 定义数据

     数据定义语法:

    [name] directive initializer [,initializer]...

    下面是数据定义语句的一个例子:

    count DWORD 12345

    类型用法
    BYTE 8 位无符号整数,B 代表字节
    SBYTE 8 位有符号整数,S 代表有符号
    WORD 16 位无符号整数
    SWORD 16 位有符号整数
    DWORD 32 位无符号整数,D 代表双(字)
    SDWORD 32 位有符号整数,SD 代表有符号双(字)
    FWORD 48 位整数(保护模式中的远指针)
    QWORD 64 位整数,Q 代表四(字)
    TBYTE 80 位(10 字节)整数,T 代表 10 字节
    REAL4 32 位(4 字节)IEEE 短实数
    REAL8 64 位(8 字节)IEEE 长实数
    REAL10 80 位(10 字节)IEEE 扩展实数

    也可以用

    伪指令用法伪指令用法
    DB 8位整数 DQ 64 位整数或实数
    DW 16 位整数 DT 定义 80 位(10 字节)整数
    DD 32 位整数或实数     

    3.4.10 为AddSub添加变量

    TITLE Add and Substract
    ;author:Hk_Mayfly
    ;date:2019/09/06
    
    INCLUDE Irvine32.inc
    
    .data
    Num1 DWORD 10000H
    Num2 DWORD 20000H
    Num3 DWORd 30000H
    Sum Dword 0
    
    .code
    main PROC
        mov eax,Num1
        add eax,Num2
        add eax,Num3
        mov Sum,eax
    
        call DumpRegs
        exit
    main ENDP
    END main

    3.4.12 本节习题

    1.Val SWORD ?
    
    2.Val BYTE ?
    
    3.Val SBYTE ?
    
    4.Val QWORD ?
    
    5.SDWORD
    
    6.Val SDWORD 10000000000000000000000000000000
    
    7.wArray WORD 1,2,3
    
    8.Color BYTE "Blue"
    
    9.dArray DWORD 50 dup(?)
    
    10.Val BYTE 500 dup('TEST')
    
    11.bArray BYTE 20 dup(0)
    
    12.21h,43h,65h,87h
    

    3.5 符号常量

    3.5.5 本节习题

    1.VK_BS = 08h
    
    2.SecondsInDay = 24*60*60
    
    3.ArraySize = ($-myArray)
    
    4.ArraySize = ($-myArray)/4
    
    5.PROCEDURE TEXTQU <PROC>
    
    6.sample TEXTQU <"Hello_World">
    
    MyString BYTE sample
    
    7.SetupESI TEXTQU <mov esi,OFFSET myArray>

    3.8 编程练习

    1,三个整数相减
    参考3.2节中的AddSub程序,编写三个16位整数相减的程序,程序中只需要使用寄存器即可,插入调用DumpRegs函数语句,以显示寄存器的值。

    TITLE Add and Substract
    ;author:Hk_Mayfly
    ;date:2019/09/06
    
    INCLUDE Irvine32.inc
    
    .data
    Num1 WORD 1000H
    Num2 WORD 2000H
    Num3 WORD 4000H
    
    .code
    main PROC
        mov eax,0
        mov ax,Num3
        sub ax,Num2
        sub ax,Num1
    
        call DumpRegs
        exit
    main ENDP
    END main

    2,数据定义
    写一个程序,要求包含3.4节中列出的所有数据类型的定义,用合适的值初始化每个变量

    TITLE Add and Substract
    ;author:Hk_Mayfly
    ;date:2019/09/06
    
    INCLUDE Irvine32.inc
    
    .data
    Num1 BYTE 'abc'
    Num2 SBYTE -10H
    Num3 WORD 1000H
    Num4 SWORD -1000H
    Num5 DWORD 10000H
    Num6 SDWORD -10000H
    Num7 FWORD 100000H
    Num8 QWORD 123456789ABCDEF0H
    Num9 TBYTE 123456789123456789H
    Num10 REAL4 2.56
    Num11 REAL8 2.12345
    Num12 REAL10 2.12345678
    
    
    .code
    main PROC
        mov eax,0
        mov al,[Num1+1]
    
        mov al,Num2
    
        mov eax,0
        mov ax,Num3
    
        mov ax,Num4
    
        mov eax,0
        mov eax,Num5
    
        mov eax,Num6
    
        call DumpRegs
        exit
    main ENDP
    END main

    3,整数符号常量
    写一个程序,定义对应一周内每天的符号常量,创建一个数组变量并使用这些符号作为初始值

    TITLE Add and Substract
    ;author:Hk_Mayfly
    ;date:2019/09/06
    
    INCLUDE Irvine32.inc
    
    .data
    WEEK BYTE 'Mon'
         BYTE 'Tue'
         BYTE 'Wed'
         BYTE 'Thu'
         BYTE 'Fri'
         BYTE 'Sat'
         BYTE 'Sun'
    
    ;STR_LEN = ($-WEEK)
    
    
    .code
    main PROC
        mov eax,0
        shr eax,16
        mov al,[WEEK];'W'
        shl eax,16
        mov ah,[WEEK+1];'e'
        mov al,[WEEK+2];'d'
    
        call DumpRegs
    
        exit
    main ENDP
    END main

    4,文本符号常量
    写一个程序为几个字符串(引号括起的字符)定义符号名。在变量定义中分别使用每个符号

    TITLE Add and Substract
    ;author:Hk_Mayfly
    ;date:2019/09/06
    
    INCLUDE Irvine32.inc
    
    .data
    Str1 TEXTEQU <"Hello_World!">
    Str2 TEXTEQU <"I_Love_CTF!">
    Str3 TEXTEQU <"REVE">
    Str4 TEXTEQU <'Q'>
    
    
    .code
    main PROC
        mov eax,0
        mov al,[Str4]
        mov eax,[Str3]
    
        call DumpRegs
    
        exit
    main ENDP
    END main

  • 相关阅读:
    linux并发控制之读写信号量
    linux并发控制之原子操作
    JAVA IntelliJ IDEA for mac/jdk的安装及环境配置、运行
    HDU2553 N皇后问题dfs
    LightOJ1282Leading and Trailing快速幂+数学
    HDU1226超级密码队列+广搜+大数取模
    Aizu ALDS1_13_A8 Queens Problem八皇后的路径输出
    HDU1548 A strange lift BFS
    POJ1182 食物链 并查集
    UVA10200Prime Time判断素数个数(打表预处理)+精度控制
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11477976.html
Copyright © 2020-2023  润新知