汇编语言

汇编语言(四)--第一个程序

大兔子大兔子 提交于 2020-02-17 09:16:56
第四章 第一个程序 4.1 一个源程序从写出到执行的过程 简要过程: 编写 ⟶ \longrightarrow ⟶ 编译 ⟶ \longrightarrow ⟶ 连接 ⟶ \longrightarrow ⟶ 执行 编写汇编源程序 使用文本编辑器,用汇编语言编写汇编源程序 对源程序进行编译连接 使用汇编语言编译程序对源程序文件中的源程序进行编译,产生 目标文件 ;再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的 可执行文件 。 可执行文件 可执行文件中包含两部分内容: 程序(从原程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据) 相关的描述信息(比如:程序有多大、要占多少内存空间等) 执行可执行文件中的程序 在操作系统中,执行可执行文件中的程序。 操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如:设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。 4.2 源程序 汇编指令 有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行 伪指令 没有对应的机器码的指令,最终不被CPU所执行。 谁来执行伪指令呢? 伪指令是由 编译器 来执行的指令,编译器根据伪指令来进行相关的编译工作 4.2.1 定义一个段 segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时

汇编语言王爽第九部分(使用LIB分文件编写课题设计1)

微笑、不失礼 提交于 2020-02-14 22:38:38
课题设计1 需要编写3个函数,分别用三个asm保存,使用分文件的好处是 lib文件里面包括了一些常用的库函数,常用的操作等等,这样在需要这些东西时,就不需要重复一直打这些代码。 编写show.asm public show assume cs : code code segment show proc far push ax push bx push cx push dx push si push di push es mov ax , 0 b800h mov es , ax mov ax , 0 a0h mul dh mov bx , ax mov ax , 2 mul dl add bx , ax mov dl , cl s : mov cl , [ si ] mov ch , 0 jcxz s_ok mov al , cl mov ah , dl mov es : [ bx ] , ax inc si add bx , 2 jmp short s s_ok : pop es pop di pop si pop dx pop cx pop bx pop ax retf show endp code ends end 第二个是解决除法溢出divdw.asm public divdw assume cs : code code segment divdw proc far push

汇编语言王爽第七部分(算术运算指令)

心已入冬 提交于 2020-02-13 12:16:30
算术运算指令 实现寄存器和内存的数据的算术运算。结果影响标志寄存器的内容。 add和sub 求和指令 add ax,bx ax=ax+bx 减法指令 sub ax,bx ax=ax-bx (1)add/sub 寄存器 , 寄存器/内存单元/立即数 (2)add/sub 内存单元 , 寄存器 (3)运算对象的类型要匹配 adc 带进位加法指令,它利用CF位记录进位值 功能:操作对象1=操作对象1+操作对象2+CF 比如adc ax,bx (ax)=(ax)+(bx)+CF sbb 带借位减法指令,它利用CF位记录借位值 功能:操作对象1=操作对象1-操作对象2-CF 比如adc ax,bx (ax)=(ax)-(bx)-CF inc和dec inc功能:操作数=操作数+1 dec功能:操作数=操作数-1 比如 inc bx (bx)=(bx)+1 dec bx (bx)=(bx)-1 div 除法指令 (1)除数:有8位和16位,在内存单元或寄存器 (2)被除数:默认放在ax或ax和dx中 注意以下问题 如果除数为8位,al存储商,ah存储余数 如果除数为16位,ax存储商,dx存储余数 比如除数为16位:100001/100, mov dx,1 mov ax,86a1H mov bx,100 div bx 比如除数为8位:1001/100 mov ax,1001 mov bl

编程语言与机器

雨燕双飞 提交于 2020-02-12 14:04:23
一,编程的层次      数字逻辑(Level 1):二进制数值机器语言。   指令集架构(Level 2):计算机芯片制造商在处理器内部设计一个指令集来实现基本操作,如传送、加法或乘法。这个指令集也被称为机器语言。每一个机器语言指令或者直接在机器硬件上执行,或者由嵌入到微处理器芯片的程序来执行,该程序被称为微程序。   汇编语言(Level 3):在 ISA 层,编程语言提供了一个翻译层,来实践大规模软件开发。汇编语言出现在 Level 3,使用短助记符,如 ADD、SUB 和 MOV,易于转换到 ISA 层。汇编语言程序在执行之前要全部翻译(汇编)为机器语言。   高级语言(Level 4):Level 4 是高级编程语言,如 C、C++ 和 Java。这些语言程序所包含的语句功能强大,并翻译为多条汇编语言指令。比如,查看 C++ 编译器生成的列表文件输出,就可以看到这样的翻译。汇编语言代码由编译器自动汇编为机器语言。 来源: https://www.cnblogs.com/qq2806933146xiaobai/p/12298768.html

为什么学好计算机就必须学好汇编?

本小妞迷上赌 提交于 2020-02-12 13:25:12
这个问题太抽象。 汇编是干什么的?为什么要学好汇编?不学不行吗?要学好计算机非得学好汇编吗?乍看到这些问题,真是一头雾水。学好汇编会有什么好处?学好汇编老板就给你涨工资?还是学好汇编上天就会赐给你个大美女?还是ZF就会给你解决住房问题?真是搞不懂。不过倒可以肯定头脑没大问题的人不会选择上面三个答案。那到底是为什么呢?是啊,停留在问题的表面似乎永远找不到答案。我们试图找一下答案,我们从这里入手,学习过汇编的人会了解计算机的底层工作方式,他会了解到cpu、内存、硬盘等硬件设备是如果协调地工作在一起,数据从哪里转移到哪里,在哪里被运算,又在哪里被存储起来等等等等。总之,计算机在你的面前不会再是一个黑洞。做这样一个比喻:一个貌美的姑娘总能让小伙子产生美好的幻想,而在医生眼里他永远是由639块肌肉和206块骨头组成的躯体。同样计算机在常人眼里可能是个神奇的东西,但在专业人眼里他就是一堆晶体管。原来我们的目的是让计算机在我们眼里变成一堆晶体管,这才是我们真正要的东西。 得出结论: 我们的真正目的是让计算机在我们眼里变成一堆晶体管,而不是要学好汇编。 学好计算机就必须达到这个目的吗? 明确了我们的真正目的,轻松了一些。然而学好计算机就必须达到这个目的吗?这个问题先不回答,看下面的例子:一个医生倘若不懂人体脉络、血液流向、器官构成,只是模仿过专业医生做过内科手术,哪怕模仿的多熟练

汇编语言王爽第六部分(数据传输指令)

本小妞迷上赌 提交于 2020-02-11 19:38:38
数据传输指令 实现寄存器和内存,寄存器和寄存器之间的单个数据传送。 mov (1)MOV 寄存器 , 寄存器/内存单元/段寄存器/立即数 (2)MOV 内存单元 , 寄存器/段寄存器/立即数 (3)MOV 段寄存器, 寄存器/内存单元 非法指令 (1)操作数类型不一致,例如mov ax,bl ax是十六位寄存器,bl是8位寄存器 (2)不能修改cs段寄存器内容 (3)不能在内存之间直接传输数据 (4)不能用立即数修改DS push push ax表示将ax数据入栈,入栈以字单位进行。 push ax执行过程 (1)SP=SP-2 (2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP指向新栈顶 pop pop ax表示从栈顶取出数据送入ax,出栈以字单位进行 pop ax执行过程 (1)将SS:SP指向的内存单元处的数据送入ax (2)SP=SP+2,以当前栈顶下面的单元为新的栈顶 pushf和popf (1)pushf是将标志寄存器的值压栈 (2)popf是从栈中弹出数据 (3)原理与push和pop类似 来源: CSDN 作者: 无名至尊 链接: https://blog.csdn.net/qq_41955402/article/details/104267260

汇编语言之转移指令

拜拜、爱过 提交于 2020-02-11 01:48:17
汇编语言–转移指令 操作符 offset 功能:取得标号的偏移地址 程序: assume cs:codesg codesg segment start:mov ax,offset start ;相当于mov ax,0 s:mov ax,offset s ;相当于mov ax,3 codesg ends end start start和s是代码段中的标号,offset操作符取得了标号start和s的偏移地址0和3。 jmp指令的用法 jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。 1. 依据位移进行转移 段内短转移格式:jmp short 标号 作用:转到标号处执行指令,即(IP)=(IP)+8位位移,它对IP的修改范围为-128~127。 程序: assume cs:codesg codesg segment start:mov ax,0 jmp short s add ax, 1 s:inc ax codesg ends end start 上面的程序执行后,ax中的值为1,因为执行jmp short s后越过了add ax,1, IP指向了标号s处的 inc ax。也就是说,程序只进行了一次ax加1操作。 段内近转移格式:jmp near ptr 标号 作用:与“jmp short 标号”功能相近,不同之处在于(IP)=(IP)+16位位移

反汇编工具objdump的使用简介

折月煮酒 提交于 2020-02-11 00:01:22
1、反汇编的原理&为什么要反汇编 arm-linux-objdump -D led.elf > led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf(操作系统上的可执行文件)格式的可执行程序反过来得到汇编源代码。 -D(objdump 后面可以带不同参数实现不同功能)表示反 > 左边的是elf的可执行程序(反汇编的原材料), >右边的是反汇编生成的汇编程序。 反汇编的原因有以下: (1)、逆向破解。 (2)、调试程序时,反汇编代码可以帮助我们理解程序,尤其是在理解链接脚本、链接地址等概念时。 (3)、把C语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解C语言和汇编语言之间的对应关系。非常有助于深入理解C语言。 2、反汇编文件格式和看法 (汇编 assembly 反汇编 dissembly 大部分汇编文件以.s作为后缀) 打开反汇编后的dis文件如下图,这时要对应我们的elf(是二进制文件要用WinHex.exe软件打开)格式文件进行分析(因为elf格式还没有去掉符号,标号等,而当用arm-linux-objcopy -o binary led.elf led.bin)生成的可烧录文件已经去掉了符号等。 我们要理解:标号地址、标号名称、指令地址、指令机器码、指令机器码反汇编到的指令 扩展

汇编语言实验五

扶醉桌前 提交于 2020-02-10 22:52:27
(一)将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题 assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start (1)编辑 (2)编译、连接 来源: https://www.cnblogs.com/KKSJS/p/9977868.html

day 02小结

亡梦爱人 提交于 2020-02-09 19:54:15
1 .编程语言的分类 1.1 机器语言 ​ 优点(汇编语言):执行率高 ​ 缺点(汇编语言):开发效率低 1.2 汇编语言 ​ 优点(机器语言):开发效率高 ​ 缺点(机器语言):执行率低 1.3 高级语言 ​ 优点(汇编语言):开发效率高 ​ 缺点(汇编语言):执行效率低 3.1 编译型语言 ​ 优点(解释型语言):程序执行效率高 ​ 缺点(解释型语言):依赖编译器,跨平台性差些 3.2 解释型语言 ​ 优点(编译型语言):开发效率高 ​ 缺点(编译型语言):执行效率低 2.网络瓶颈效应 ​ 由于互联网中发送指令的时候是有延迟的,当你向互联网中连续发送指令的时候,后面的指令都需要等前面的指令处理完了之后才会被接收。也就是说,互联网之间互相通信的时间要远远大于程序执行的时间。所以在实际开发中,需要根据不同的开发目的,去选择使用什么语言去实现需求。 ​ 通俗来讲,如果我们开发一个不需要互联网也能运行的程序的时候,可以选择使用编译型语言去保证程序的执行速度;当我们开发互联网程序时,其实不会追求多块的运行速度,比如实现同样的目的,使用编译型语言只需要0.001ms,使用解释型语言需要0.1ms,看着是差了很多,但是多数时候互联网通讯的时间都远大于程序运行的时间,这个时候选择编译型语言节省下来的时间就被网络延迟浪费了,所以不如选择开发效率更快的解释型语言。 3.Python解释器的安装 3