本文主要是介绍汇编学习笔记(一) -- Hello World!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
汇编学习笔记(一): Hello World!
记:
- 刚刚开始学习汇编,作下笔记,怕日后忘记
- int 21h等为dos功能调用 功能号的作用可百度int 21h
- 功能号是放在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 返回到dosINT 21h ; dos功能调用
code endsend start ; 汇编编译程序遇到end就; 不往下编译了
-
int 21h的dos功能调用 显示字符串时 以ds:dx作为字符串的起始地址,以’$'作为结束
-
db 就相当于声明一下后面的内容依次放到一块连续的内存中 偏移量就是db前面的标示符
-
在 db中还可以用dup来声明一块内存 eg: 10 dup(0) 意思是定义一块10个字节的内存 并用0来初始化 如果(?)则说明不初始化
-
代码中的 string是个变量 但是对编译器来说它就是个地址, 如果直接用mov ax, string的话 那拿到的是sting这个地址处的内容(ax的话则拿到两个字节的内容, eax的话则拿到四个字节的内容, al或ah的话则拿到1个字节的内容), 想拿到string这个变量的本身的值(即地址)则需要用mov ax, offset string 或者 lea ax, string来获取
-
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个字节的值
- 仅作笔记之用 有何错误和不妥 希望您不吝赐教
这篇关于汇编学习笔记(一) -- Hello World!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!