图灵奖获奖得主,Alan Perlis曾说过:“如果一门语言没有改变你的编程思维,那么它不值得你去学习”
别人学高级语言,但是高级语言会变,我学低级语言,学了永远也不会变!
stack segment stack ; 定义堆栈段 db 100 dup(?) ;堆栈段长100字节, 这里db就是字节的意思,如果是用dw就是字,100 dup(?) 中的dup是重复的意思,这句话是重复100遍,一遍定义一个字节,每个字节里全填0 stack ends ; 堆栈段结束 data segment ;数据段 szHello db 'hello,world',0dh,0ah,'$' ;定义szHello , 0dh,0ah分别是回车键,换行键的ASCII码, '$'是DOS功能调用INT 21H中9号功能要求的要显示字符串的结束标志,写成szHello db 'hello,world',0dh,0ah,24h;也可以,因为24h就是'$' data ends ;数据段结束 code segment ;代码段 assume cs:code,ds:data,ss:stack ;确定cs,ds,ss,指向的逻辑段
汇编中,Assume的作用是告诉汇编程序各个段寄存器应该与哪个逻辑段对应,该伪操作把程序中定义的各个段分配给段寄存器,使程序中使用的段名与段寄存器建立起对应关系。使得汇编程序清楚在计算地址时使用哪一个段地址但并不赋予该逻辑段的段地址。没有Assume这行代码也可以,但其后的变量操作需要用段跨越前缀指明所在逻辑段。 所以说ASSUME语句是设定语句,是告诉汇编器在将源代码翻译成机器语言时,CPU的各个段寄存器如何与你定义的各个逻辑段相联系.比如ASSUME CS:CODE 这个例子CS段寄存器就选了CODE代码段.
start: mov ax,data ;设置数据段的段地址ds mov ds,ax ; mov ah,9 ; ah中的9号功能表示要显示一行字符串 mov dx,offset szHello ;取得szHello的偏移地址,也就是在ds段中的偏移地址 int 21h ;暂停,任意键关闭 mov ah,1 ;这两句是从键盘输入一个字符功能 int 21h mov ah,4ch ;退出 ah中的功能号4ch表示要返回DOS int 21h ;调用DOS code ends end start
另附上一段代码,这段代码是网上一个博客里面的,其实代码有错,我略一修改。
assume ds:data,cs:code不能放在start后面,并且结束程序的功能号是4ch:
data segment output db 'hello,world',0dh,0ah,'$' data ends code segment assume ds:data,cs:code start: mov ax,data mov ds,ax mov dx,offset output mov ah,09h int 21h mov ah,<span style="line-height: 20px;">4ch</span> int 21h code ends end start