x86汇编语言学习

语法——字符串的输出

 data segment
    str db 'hello li$'
 data ends
    
 code segment   
    
 start:
    
    mov ax,data
    mov ds,ax
    
    mov dx,offset str ;获得对应数据的偏移地址
    mov ah ,9H    ;9H表示调用显存,从dx读取偏移地址对应的数据、
    int 21H 
    
    ;退出程序
    mov ah, 4ch
    int 21h
 
 code ends
 end start

段寄存器

  • 如何区分指令和数据 -- 借助段寄存器标记

  • 段寄存器的种类

DS---->data segment  ;数据
SS---->stack segment 
CS---->code segement ;指令
ES---->extra segement
  • 段寄存器的本质是存放段地址的

段地址是物理地址的一部分

内存中的每一个实际的数据都有其物理地址

实际的物理地址通过5位十六进制表示

实际物理地址 = 段地址 * 16 ; 偏移地址
71001      = 0710  * 16 : 0001
  • DS寄存器用于存放数据的段地址,数据对应的偏移地址用bx寄存器存放

  • CS寄存器用于存放指令所在的段地址,IP寄存器存放当前正在执行的指令所对应的偏移地址

    • 所有使用CS:IP进行操作的内存数据都被当做指令,读取时将十六斤进制的数据转成对应的指令并执行

  • SS寄存器用于存放栈空间对应的段地址

    • 所有被SS操作的内存空间被当成栈空间进行对待

    • 栈的数据存放方式不同

    • SP寄存器存放栈空间偏移量,SS和SP配合使用

  • ES寄存器用于DS的替补。DS被占用而无法使用时,临时用ES代替,用法和DS一样

栈空间的操作

  • 栈是一种特殊的存储结构。

  • 正常的数据排列方式是数据从低地址向高地址进行偏移存放,读取也是这样

  • 而栈是写入数据时,从高到低进行偏移;读取时是从低到高进行读取

    • 因此,在定义一块空间作为栈空间使用时,都会先往高地址偏移一段空间

栈存储特点:

  • 一次读写两个字节的数据

  • 数据高地址往低地址逆序偏移存放

  1. 栈空间的声明 -- 开辟一块未标记内存空间,用ss标记为栈空间

  2. 向栈空间内写入数据 -- 使用push指令

  3. 从栈空间中读取数据 -- 使用pop指令

data segment
    db 0,0,0,0,0,0,0,0     ;定义数据,相当于开辟一块未标记内存空间
data ends
​
code segment
    start:
        mov ax, data
        mov ss, ax ;用ss将这块空间标记为栈空间
        mov sp, 8 
        
        mov ax, 2000H
        push ax ;使用push指令,向栈空间内写入数据,一次写入两个字节的数据,如果使用al会编译报错
        
        pop bx ;使用pop指令,从栈空间内读取数据,一次读取两个字节的数据,如果使用bl会编译报错
code ends
end start

    • 栈空间和数据段空间中,存放的都是数据

    • 可以使用ss来存放数据段的段地址,读写操作和DS一样,例如SS:[N];如果充当栈段时,读写操作是pop和push

    • 由于pop和push默认以SS寄存器中的数据作为栈段地址,故不能使用其他段寄存器充当栈段寄存器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值