汇编 HelloWorld

简介:

图灵奖获奖得主,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





相关文章
|
9月前
CPP2022-01-Helloworld
CPP2022-01-Helloworld
32 0
|
6月前
[笔记]vs2015 编写汇编masm32 Helloworld
[笔记]vs2015 编写汇编masm32 Helloworld
|
存储 Java 编译器
Smali 语法解析——Hello World
Smali 语法解析——Hello World
Smali 语法解析——Hello World
|
Java 编译器
javap(反汇编命令)详解【转】
转自:http://blog.csdn.net/hudashi/article/details/7062668 javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。
1124 0
得到Go程序的汇编代码的方法
有多种方式可以获得Go程序的汇编代码, 尽管输出的格式有些不同,但是都是方便阅读的汇编代码,可以帮助我们更好的了解程序的底层运行方式。 我们看下面一段代码, 它是sync.Once的实现,去掉了不必要的注释,复制出来用来研究的一段小代码: once.
21628 0
|
C语言 iOS开发 MacOS
汇编语言版本的HelloWorld
平台 macOS 工具 nasm clang 文件 main.asm extern _printf ; 这里调用系统的一个系统调用函数, _printf, 使用extern告诉链接器该label在其他文件中有定义, _printf只接受一个string的地址, 和C语言层面上的printf是一样的 section .
967 0
|
C语言
01-2.C(C程序编译步骤-gcc 编译过程)
c代码编译成可执行程序4步: 1.预处理:宏定义展开,头文件展开,条件编译,同时将代码中的注释删除,这里并不会检查语法 gcc -E hello.c -o hello.
746 0
|
C语言
一文解决C程序的编译问题
对于C源码编译,大部分人都停留在./configure --prefix=XXX && make && make install这一步,大部分的程序都能顺利走完这一步,然后被安装到指定的文件下,小部分的程序会因为xxx不全而出错,然后你把这个问题放到搜索引擎上,就会找到一篇博客说用sudo apt-get/yum install xxx 后可以解决问题,然后问题解决了。
928 0