• 初学汇编常见问题


    刚开始学习Masm汇编,有些东西好像跟教材不怎么一样,有可能是Masm版本问题,我选择的是Masm6.11,用vim编辑代码(有语法加亮),网上下载好像要分,VMware16虚拟机链接如下:

    链接:https://pan.baidu.com/s/1pLR0YKzh7HGCpM0LZRw2Xw
    提取码:yp6e

    1、代码中assume ss:stacksg,并且定义了stacksg,为什么还提示:Link:warning L4021:no stack segment没有堆栈段呢,这里跟教材稍微不同,堆栈段需要这样定义stacksg segment stack。

    2、十六进制数如果第一个是字母,应该写成数字0开头,如B800H,必须写成0B800H,否则会提示错误error A2006:undefined symbol xxx,编译器把数字xxx做符号变量处理了。

    3、汇编代码不区分大小写,并通过分号(;)来表示代码注释。

    4、常用教材都是通过segName segment与segName ends来定义段,但在Masm5之后,如果没有特殊的要求,可通过简单的方式定义段:.model、.data、.code、.stack、.startup、.exit等,如:

    .model tiny
    .data
    .stack
    .code
        .startup
        .exit 0
    end

    .model tiny指的是建立com文件,通常用small,编译成exe可执行文件。

    .stack xxx,如果不设置,则stack默认为1024Byte,即1K。如.stack 100,即栈空间为100Byte。

    .exit后跟返回码,如.exit xxx,与mov ax,4cxxh相同。.exit后跟end,且与.startup成对出现。

    5、group(组)指的是一组segment(段)的集合,语法是:name GROUP segment [[, segment]]...,在.MODEL语法下,默认将stack和data段定义在DGROUP下,方便进行访问,只要在相应的模式下,Group的总大小不超过64K或4G,可在任何时候向组添加段成员,且添加的段成员顺序并不影响最终在内存中的排列顺序。

    6、ret除了可以返回以外,还可以控制SP的出栈数量,ret n的语法含义是:

    1 pop ip  
    2 add sp,n

    即返回调用出IP后,在弹出需丢弃的栈元素,通常用于子程序参数的栈传递。

    7、Lea和Offset作用都是获取偏移地址,前者是Cpu指令,后者是伪指令(在编译的时候计算,对CPU来说相当于立即数)。Offset只能对变量或标号进行计算,当不能对一般操作数进行计算,如:Lea ax,[bx+si]。但伪指令在编译时计算,且后者是3字节内存寻址指令,所以用Offset程序运行速度较快。

  • 相关阅读:
    arguments伪对象数组 javascript
    typeof获取变量的数据类型 javascript
    《转》Cucumber之一Cucumber概述——学习新篇章
    【转】Dubbo分布式服务框架
    SQL语句
    (转)面试必备之乐观锁与悲观锁
    多线程的实现方式
    Exception和RuntimeException区别
    实例化对象的两种方式
    包装类对象的比较
  • 原文地址:https://www.cnblogs.com/meizhouxiang/p/14695715.html
Copyright © 2020-2023  润新知