汇编顺序程序设计记录

7 篇文章 0 订阅
4 篇文章 0 订阅

菜鸡遇上汇编和ubuntu,整乱了,记录一下笔记

已经安装masm和dosemu,安装过程笔记,虽然也不算笔记

终端输入 dosemu

在dos窗口输入   edit  ,使用dosume的编辑器

ctrl+n 新建文件,编辑程序

参考程序(在20个学生成绩中查询8号学生的成绩)

DATA    SEGMENT
TABLE1  DB      81, 78, 90, 64, 85, 76, 93, 82, 57, 80;  数据段数据,字节数据,8位,存储是用16进制存储,即 81 在数据段基址值:0000的位置占一个单元用51存储,78 在在数据段基址值:0001的位置占一个单元用4E存储,以此类推
        DB      73, 62, 87, 77, 74, 86, 95, 91, 82, 71;  共20个数据,从数据段第0单元到第19单元 
NUM     DB      8;  存放在数据段第20单元
MATH    DB      ?; 存放在数据段第21单元
DATA    ENDS

STACK1  SEGMENT PARA    STACK
        DW      20H     DUP(0)
STACK1  ENDS
CODE    SEGMENT
        ASSUME  CS: CODE, DS: DATA, SS: STACK1

START:  MOV     AX, DATA; AX <- table1
        MOV     DS, AX; DS <- AX=table1
        MOV     BX, OFFSET TABLE1; BX <- ptr table1
        XOR     AH, AH;  AX=0000H, CF=OF=0
        MOV     AL, NUM; AL=08H, AX=0008H
        DEC     AL; AL=07H, AX=0007H
        ADD     BX, AX; BX <- [BX]+[AX]=( byte ptr table1) + 0007H, 即指向table1的第八个单元
        MOV     AL, [BX]; AL <- 52, 16进制52即10进制82
        MOV     MATH, AL; MATH <- 52
        MOV     AH, 4CH
        INT     21H
CODE    ENDS
        END     START

ctrl+x , 根据提醒保存文件,我这里文件名为tast1,后缀asm,即 tast1.asm

在doc输入 msam tast1.asm ,敲回车,看输出的提醒,如果文件有错误就重新编辑,、重新 msam tast1.asm, 生成 tast1.obj

输入 link tast1.obj ,回车,看输出提醒,同上,看不出什么异常就是没问题,生成 tast1.exe

输入 debug tast1.exe,回车,进入debug模式

debug命令
Q: 退出
D: 显示内存,多次输入D显示的是上一次显示已内存地址之后的内存,可显示指定地址 D[起始地址[:结束地址]]
 eg: D07E2:0000
R: 检查寄存器
U: 反汇编命令,地址可指定

 -R 解析

  >>  AX=0000 BX=0000 CX=007A DX=0000 SP=0040 BP=0000 SI=0000 DI=0000
      DS=07D2 ES=07D2 SS=07E4 CS=07E8 IP=0000 NV UP DI PL NZ NA PO NC
      07E8:0000 B8E207    MOV  AX,07E2

前4个是通用寄存器,你知我知~~
SP=0040
    前面代码 STACK1 SEGMENT 里面有一句 DE 20H DUP(0) ,意思是申请20H个字的空间,即40H字节
DS=07D2
    这里是DS原来存放的东西,不是数据段的段基值,段基值由代码指出,继续往下看
ES=07D2
    附加段段基值?
ss=07D2
    堆栈段的段基值
CS=07E8,   07E8:0000 B8E207 MOV AX,07E2
    代码段的段基值,即代码段开始的位置 输入 D07E8:0000可以查看程序反汇编数据
    看到下一行的 07E8:0000 B8E207 MOV AX,07E2
    细心可以看出数据相同,即内存 07E8 单元开始为代码段, 第一条指令为MOV AX,07E2  ,即 B8E207
    此处07E2指出前面提到的数段段基值,即数据存放是从内存 07E2:0000 处开始存放的

 -U 解析

-U解析
   反汇编得到的代码,首句为 B8E207 , 末句为 F0,可以对应到输入 D07E8:0000 显示数据

-D解析

因为前面输入过D命令,此处定位到数据段0000位置
可见输出最左端为地址,07E2为数据段段基值,冒号后为偏移量
一行中间显示16个16进制数据第8个和第9个用 - 连接
52 4E ... 对应data segment中数据 81 78 ... 
右端显示数据ascii码对应字符

-G 执行程序,执行程序之后内存数据可能改变,此处变量math的值(见上图07E2:0015的位置,即数据08之后,参考下图右侧圈出位置)由00变为52

that‘s all, 输入q退出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值