汇编语言学习(二)

今天学习了王爽《汇编语言》第5、6章。
我感觉这两章主要加深了对于这个概念的理解。

第5章[Bx]和loop指令,重点在于段地址和偏移地址的理解,段前缀的应用。
第6章包含多个段的程序,重点在于理解为什么要分段,掌握分段汇编程序的写法,搞清楚段在内存当中的存储。

1.loop指令[bx]的应用
1.1 计算ffff:0~ffff:b单元中数据的和,并将结果保存在dx中?

存在的问题:8位的内存单元累加之和放到16位的寄存器中

解决的方法:ax为中介,其中ah设为0,al为内存单元的值。

mov ax,0ffffh里面,0h一个都不能少。

assume cs:code
code segment
    mov ax,0ffffh
    mov ds,ax
    mov ax,0
    mov dx,0
    mov bx,0
    mov cx,12
  s:mov al,[bx]
    add dx,ax
    inc bx
    loop s  
    mov ax,4c00h
    int 21h 
code ends
end
1.2 将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b中?

段前缀的应用ds、cs、ss、es都可以使用,很灵活。

注意题目是,将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中。将段前缀设置为0020h0要方便。

   mov ax,0ffffh
   mov ds,ax
   mov ax,0020h
   mov es,ax
   mov bx,0
   mov cx,12
s: mov dl,[bx]
   mov es:[bx],dl
   inc bx
   loop s
2.包含多个段的程序
2.1 如何对数据进行累加?

即一些数据常量应该如何声明,如何引用?

采用dw 0123h,0456h,0789h进行声明。

通过cs:[bx]进行定位,bx每次增加2个字节。

但是仅仅只做这些改变,在运行时就会出现问题。先看一下程序的内存:

这里写图片描述

可以看出前6个字节存储的三个字的值,为避免将数据当作指令,程序应该从0C53:0006开始执行。

所以需要在源程序中用end标号,标记程序的入口地址。

2.2 利用栈,将程序中定义的数据逆向存放?

首先,提前声明一块空间,供栈使用。

另外,设置好栈的段地址和偏移地址。

示例程序如下:

assume cs:code
code segment

        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        dd 0,0,0,0,0,0,0,0

start:mov ax,cs
      mov ss,ax
      mov sp,30h

      mov bx,0
      mov cx,8
   s: push cs:[bx]
      add bx,2
      loop s

      mov bx,0
      mov cx,8
   s1:pop cs:[bx]
      add bx,2
      loop s1

      mov ax,4c00h
      int 21h

code ends
end start
2.3 结构更清晰——将代码分多个段

下面是之前提及的例子,不过分了数据、栈和代码三段。

需要注意的是:

1.在assume之后,CPU不会将CS指向code,不会将DS指向data,不会将SS指向stack。

2.end指明了程序的入口,这个入口将被写入可执行文件的描述信息。可执行文件中的程序被加载到内存之后,CPU的CS:IP被设置指向这个入口,开始执行程序中的第一条指令。

所以,CS的值不用在代码中设定,但是DS和SS的值需要在代码中进行说明。

3.对于一个段,如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为:

(N/256+1)*256

其中除法取整。

assume cs:code,ds:data,ss:stack

data segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends

stack segment
    dw 0,0,0,0,0,0,0,0
stack ends

code segment
start:  mov ax,stack
         mov ss,ax
         mov sp,20h       
         mov ax,data
         mov ds,ax

         mov bx,0
         mov cx,8   
s:       push [bx]
         add bx,2
         loop s

         mov bx,0
         mov cx,8
s1:      pop [bx]
         add bx,2
         loop s1

         mov ax,4c00h
         int 21h
code ends
end start

自己通过调试,发现段在内存中的存储方式,是很有意思的一件事情。
不过更有意思的永远都在后面(手动滑稽)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值