Day1-前言
# 前言
前言
编程语言:
机器语言 ----> 汇编语言 ----> 面向过程语言(比如C) ----> 面向对象 C++ 等 ---> 。。。
汇编语言作为一门低级语言,其实它的语法更简单,但是代码可读性就会越差,代码的维护性就会越差,维护困难的语言不利于大型项目的开发,程序员的开发难度、项目的维护成本就会加大
这样高级语言的快速发展成为必然
因此,想要学习汇编不能单纯背诵语法,没有实战项目的需要,很快就会忘的一干二净
为啥要学汇编语法?
局部变量是怎么存储的,内存怎么分区的,函数是如何调用的,程序又是如何启动的 等等 ?
当你学完c 或者其他高级语言后,尽管您已经熟练掌握并且开发了较为复杂的软件,但是依然有种对编程语言底层运行机制的陌生感,恰好又想去了解一下,那么就需要学习一下汇编了
每个人学习的动机不同,应该根据自己的学习动机来确定学习的目标
储备
学汇编语法前提是需要有一点编程基础的,只要有过开发经历的同学都可以进行学习,否则建议先了解一下高级语言,或者 c 语言语法 本文将通过对比c 语言来了解汇编语言,为进一步深入了解其他语言
# Hello World!
按照国际惯例,不管是编程语言,还是编程软件,先来个 Hello World! 吧
网上找一个在线编译的网站,有很多,我随便找一个如下:
打开网站 https://www.nhooo.com/tool/assembly/
映入眼帘的就是默认展示一段 输出 Hello World! 的汇编代码
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
(运行结果没反应,八成是在线服务不支持了。。。😓,很多在线编译器都关闭了汇编的支持)
接着去一顿搜索,发现有说使用VsCode 比较方便,然后跟着下载安装,给我的一个示例是这样的:
data SEGMENT
hello DB 'Hello World!$' ;注意要以$结束
data ENDS
code SEGMENT
ASSUME CS:CODE,DS:DATA
start:
MOV AX,data ;将data首地址赋值给AX
MOV DS,AX ;将AX赋值给DS,使DS指向data
LEA DX,hello ;使DX指向hello首地址
MOV AH,09h ;给AH设置参数09H
INT 21h ;执行AH中设置的09H号功能。输出DS指向的DX指向的字符串hello
MOV AX,4C00h ;给AH设置参数4C00h
int 21h ;调用4C00h号功能,结束程序
code ENDS
END start
右键代码文件,运行当前文件,结果正常打印 Hello World!
咋和前面示例语法不一样呢???
于是搜索 汇编 Hello World! 示例代码,乖乖
有这样的:
[bits 64]
global _start
section .data
message db "Hello, World!"
section .text
_start:
mov rax, 1
mov rdx, 13
mov rsi, message
mov rdi, 1
syscall
mov rax, 60
mov rdi, 0
syscall
还有这样的:
bdos equ 0005H ; BDOS entry point
start: mvi c,9 ; BDOS function: output string
lxi d,msg$ ; address of msg
call bdos
ret ; return to CCP
msg$: db 'Hello, world!$'
end start
可以说是多姿多彩,百花齐放。。。
眼花缭乱。。。
😓 我菜了的,显示一个字符串都这么复杂,从零到放弃!
明天再说,再见!