汇编学习笔记(一) -- Hello World!

来源:互联网 发布:京东网络同步时钟 编辑:程序博客网 时间:2024/05/20 09:07
汇编学习笔记(一): Hello World!

记:
1. 刚刚开始学习汇编,作下笔记,怕日后忘记
2. int 21h等为dos功能调用 功能号的作用可百度int 21h
3. 功能号是放在ah中的,返回的值等 请百度

data  segment     ; 定义数据段    string   db 'Hello World!','$'          ; db(define byte)用来定义一段内存数据 字节为单位 是伪指令data  endscode segment      ; 定义代码段    assume   cs:code, ds:data    ; 将段与寄存器关联                                 ; 具体意思不详    start:         mov  ax, data            ; 拿到数据段的段地址        mov  ds, ax              ; 将段地址赋给ds段寄存器        lea  dx, string          ; 拿到string在数据段中                                             ; 的偏移量        mov  ah, 09h             ; 功能号 09h在屏幕输出                                 ; 以'$'结尾的字符串        INT  21h                 ; dos功能调用         mov  ah, 4ch             ; 功能号 4ch  返回到dos        INT  21h                 ; dos功能调用code ends    end start                    ; 汇编编译程序遇到end                                 ; 不往下编译了
  1. int 21h的dos功能调用 显示字符串时 以ds:dx作为字符串的起始地址,以’$’作为结束

  2. db 就相当于声明一下后面的内容依次放到一块连续的内存中 偏移量就是db前面的标示符

  3. 在 db中还可以用dup来声明一块内存 eg: 10 dup(0) 意思是定义一块10个字节的内存 并用0来初始化 如果(?)则说明不初始化

  4. 代码中的 string是个变量 但是对编译器来说它就是个地址, 如果直接用mov ax, string的话 那拿到的是sting这个地址处的内容(ax的话则拿到两个字节的内容, eax的话则拿到四个字节的内容, al或ah的话则拿到1个字节的内容), 想拿到string这个变量的本身的值(即地址)则需要用mov ax, offset string 或者 lea ax, string来获取

  5. eg:
    data segment
    string1 db ‘string1$’

    string2 db ‘string2$’
    data ends

    assume ds:data
    编译器编译后 string1 即为 DS:0000
    string2 即为 DS:0008 (因为 ‘string1$’是8个字节)
    所以此时用 mov ax, string1 则是到 DS:0000处取2个字节的值

    • 仅作笔记之用 有何错误和不妥 希望您不吝赐教
0 0