问题一:用什么软件编写汇编语言呢 学单片机吧,用这个软件吧,集汇编、仿真一体的。而且是共享的。
51汇编集成开发环境 ,点击放大
问题二:汇编是用什么软件编的? 清华大学出版社出版的《汇编语言》是经典教材,作者:朱玉龙等。图书ISBN:7302068119
汇编语言是用二进制语言编写,也就是我们常说的机器语言,汇编语言与处理器密切相关。每种处理器都有自己的指令系统,相应的汇编语言各不相同。所以,汇编语言程序的通用性、可移植性较差。相对来说,高级语言与具体计算机无关,高级语言程序可以在多种计算机上编译后执行。
汇编语言功能有限,又涉及寄存器、主存单元等硬件细节,所以编写程序比较繁琐,调试起来也比较困难。高级语言提供了强大的功能,采用类似自然语言的语法,所以容易被掌握和应用,它不必关心诸如标志汇编语言本质上就是机器语言,它可以直接、有效地控制计算机硬件,因而容易产生运行速度快、指令序列短小的高效率目标程序。高级语言不易直接控制计算机的各种 *** 作,编译程序产生的目标程序往往比较庞大、程序难以优化,所以运行速度较慢。
可见汇编语言的主要优点就是可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。这些优点使得汇编语言在程序设计亥占有重要的位置,是不可被取代的。汇编语言的缺点也是明显的。它与处理器密切有关,要求程序员比较熟悉计算机硬件系统、考虑许多细节问题,导致编写程序繁琐,调试、维护、交流和移植困难。因此,有时可以采用高级语言和汇编语言混合编程的方法,互相取长补短,更好地解决实际问题。
汇编语言用助记符代替 *** 作码,用地址符号代替 *** 作数。由于这种“符号化”的做法,所以汇编语言也称为符号语言。用汇编语言编写的程序称为汇编语言“源程序”。汇编语言“源程序”不能直接运行,需要用“汇编程序”把它翻译成机器语言程序后,方可执行,这一过程称为“汇编”。汇编语言“源程序”比机器语言程序易读、易检查、易修改,同时又保持了机器语言执行速度快、占用存储空间少的优点。汇编语言也是“面向机器”的语言,不具备通用性和可移植性。
问题三:一般用什么软件来写汇编程序? 楼主你好
编写汇编语言源程序一般用纯文本编辑就可以了,扩展名采用ASM比较大众化。目前比较好的IDE是国内的ma plus,免费软件,下载地址在:
aogosoft/ma plus/
国际上比较著名的是rada ,但一般用不到那么高级,支持几十种编译器呢!
三级等级考试使用的是MASM 40的ma exe和linkexe,知道怎么用即可。
建议楼主下载ma plus来写程序,或下载notepad++作为源码编辑环境。
楼主应该可以搞定的
问题四:汇编语言用什么软件写的?后缀名是什么? 发点哆嗦
1
汇编语言不是用什么软件写的
汇编语言是一种编程语言
汇编源程序(代码)才是用什么来编辑的
例如用notepad可以编辑
用edit也可以编辑
用debug也可以
代码最后编译成程序
windows一般用ma 或者ta
linux里面用na (还有其它)
汇编源程序保存成扩展名为a 的文件
(不同的 *** 作系统会有不同
例如windows 与 linux上面的汇编就不同
-------------------
例如
开始/运行/cmd
edit testa
接着输入代码
保存
用编译器编译成exe 或者文件
再在cmd下运行
问题五:单片机(汇编语言)需要的软件? 51单片机是Keil 软件
pic单片机是MPLAB软件
汇编要将编辑文件要保存为a 为后缀的文件(c语言则是c为后缀)
avr单片机是avr studio 或iccavr软件
汇编要将编辑文件要保存为s为后缀的文件(c语言则是c为后缀)
51单片机可以很多下载软件 将你的汇编程序 在Keil 软件中设置为:
options for target 1->output->create HEX file
生成hex文件 然后将这个hex文件通过下载软件下载到单片机中
下载软件有两类:串口下载和ISP接口下载
ISP接口下载软件是对应你的下载器的(一般买下载器都会给你对应的下载软件的)
串口下载:STC类的51单片机可以用STC_ISP_V486exe,但是对于Atmel类的就不行
微机原理的上机课都是在DOS下输入EDIT XXASM后编写的,单片机也是这样吗?
单片机不是这样的 因为微机机器码和单片机机器码是不一样的
所以单片机需要在windows下用对应的软件生成单片机的机器码 在单片机中才能运行啊
祝你学习进步
问题六:编程语言和汇编语言有什么区别啊 计算机语言从低级到高级可以分为:
机器语言,即由0、1组成的机器硬件可以识别的语言;
低级语言,即汇编语言
中级语言,如C语言
高级语言,如C++,JAVA,C#等。
汇编语言是将由0、1组成的机器语言用具有简单语义的英文代码表示,以便于理解和程序员编程。汇编语言通常用于对硬件的直接 *** 控。由于汇编语言编写的程序很小,所以通常在程序中最核心的、控制硬件的代码可以采用汇编语言编写,一方面是安全,另一方面提高运行速度。
对于计算机的初学者,应该从中高级语言学起,如c语言,vb,java等,如果你是想要学习如何编程,学习一到两门高级语言已经够用了。
如果你已经掌握了基本的编程技能,最好是可以学习数据结构和 *** 作系统以及计算机硬件的基本工作原理,以便优化你编写的程序,提高安全性和运行效率。
如果你想要从事更高级的开发工作,则可能需要学习汇编语言。
在高校中,计算机科技专业的学生汇编语言是必修课,而软件工程专业的学生则对汇编语言不做要求。
至于汇编与编程的区别是显而易见的,汇编语言是一种用于编写某些程序的语言。而编程则是程序员用某种语言编写程序的过程。
问题七:试用汇编语言编写一个程序,该程序的功能如下: 当BL为0,将0―255这256个数从小到大的顺序放入
当BL为1,将0―255这256个数从大到小的顺序放入
当BL为其它,将0放入以3100H为起始的单元中去
;
MOV AL, 0
MOV CX, 256
MOV DI, 3100H
LP:
MOV [DI], AL
CMP BL, 0
JNZ ONE
INC AL
JMP NEXT
ONE:
CMP BL, 1
JNZ NEXT
DEC AL
NEXT:
INC DI
LOOP LP
HLT
END
问题八:用汇编语言编写一个简单程序 1计算U=(X+(YZ-100))/W
其中:X,Y,Z,W均为十六位有符号数。
程序如下:
DATA SEGMENT
X DW 10 ;16位变量
Y DW 20
Z DW 30
W DW 40
U DW ,
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,Y
IMUL Z ;计算YZ,内容放在DX,AX中
MOV CX,AX
MOV BX,DX
SUB CX,100 ;计算YZ-100
SBB BX, 0
MOV AX,X
CWD ;将X符号扩展,形成DX:AX中的双字
ADD AX,CX ;计算X+(YZ-100),内容放在DX,AX中
ADC DX,BX
IDIV W ;计算(X+(YZ-100))/W
MOV U,AX
MOV U+2,DX
MOV AH,4CH
INT 21H
CODE ENDS
END START
问题九:汇编语言用什么工具编写较好 汇编工具有很多
1、MASM(我以前用的,分步的,初学者不易掌握)
2、VISUALASM(我一直在用,感觉比较好,集成环境的,软件下载地址:onlinedown/soft/2002) (强烈推荐)
3、win32汇编的ma 32软件包(Windows环境下的)
4、na (linux平台)
5、RadASM下载地址crsky/soft/5471
问题十:用汇编语言编写的源程序计算机是否可以直接执行 汇编语言(Assembly Language)是面向机器的程序设计语言汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。 用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编语言把汇编程序翻译成机器语言的过程称为汇编。
可以使用 Intellij Idea 2017编辑器对JAVA特定区域进行编辑。具体 *** 作如下:
1、打开文件编辑,启用活动编辑。
2、通过find action或者search everywhere命令,对JAVA特定区域进行编辑。
3、使用编辑区来进一步编辑和分类你的源代码。
延展回答:JAVA简介。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
开发一个管理系统
管理系统得有页面吧,页面我该怎么开发呢?
于是你百度:前端入门,然后你就知道了,原来我使用 html js css就可以写一个页面出来了。假设你坚持到了这一步,你发现用js写这些东西好麻烦啊,特别冗长,关键是原生的JavaScript还有各种浏览器兼容性的问题,你写出来的东西在chrome上能用,在ie上就展示的不正常了。
于是乎你又百度:js框架。浏览器告诉你js的框架有很多:JQuery,React,Vue,假设挑选了Jquery来做你的项目,你会发现,额 是比之前爽多了,毕竟框架会集成好很多方便的功能,你觉得你的效率在提高。
现在你坚持到了第四步,但是你又发现了新的问题,虽然相比之前JQuery *** 作起来是简单了许多,不过还是要我主动 *** 作dom对象,有没有办法:我只关心我当前页面所用的数据是啥玩意就行了,改了数据之后,跟数据绑定的页面元素能够自动改变呢?这样我不就不用自己 *** 作dom了吗?
哦,对了,我之前搜索js框架的时候还有Vue和React,这都是啥玩意,于是乎,
你百度:Vue入门。
好了,你开始使用Vue来写你的前端页面了,相比之前效率又高了很多,使用Vue的过程中,你可能接触到越来越多的概念,前端的模块啊,打包啊等等。
你也许觉得写前端真他妈好玩,于是乎你关闭了这篇文章,去搜索:前端学习路线图。。。。
PS:我现在很难受,我是来跟你们一起学习java的终于到后端了:现在你已经会写页面了,可是管理系统的数据我怎么展示在页面上呢,总不能写死在页面上吧。
要是能有个地方存这个管理系统的数据,并且我的页面可以从那个地方拿就好了。
存数据的地方肯定就是叫数据库啦,于是你百度:数据库入门,书上告诉你数据库有好多种:sql server、mysql、oracle、db2 但是无论是哪一种都要先学习一下SQL,不管了,程序员就是爱学习,学呗你现在学会了sql了,你按照网上的说明安装了mysql数据库,知道了怎么用sql *** 作数据库里面的数据,真是个天才。
但是没用啊,我给别人用的是系统哎,我不能跟他说,你过来,我给你用sql展示一下数据库里面有哪些数据吧。既然是个的管理系统,的增删改查肯定都得放在后端来做吧,毕竟前端只是做页面样子和交互,后端才是处理数据的,对的增删改查就是对数据库的增删改查呗。
哦,我记得之前java书上看到JDBC可以 *** 作数据库,把这块知识点捡起来,试着写一段程序 *** 作一下吧。
好厉害,你竟然已经学会了java *** 作数据库,现在哪怕不打开数据库,不借助数据库的各种客户端你也能通过你的java代码查到库里面的内容了。但是还有个问题,我前端页面怎么跟后端打交道呢?换句话说,我前端页面写的花里胡哨的,可是该怎么告诉后端程序:你给我展示一下数据库里面有哪些书?
数据库里面有没有一个叫java从入门到放弃的书?于是你百度:js前后端交互你发现了Ajax,js中的这种技术可以请求后端的接口,拿到数据。然后用数据做相应的展示、交互之类的。并且你也知道了json,他几乎成了前后端交互事实上的数据标准。
于是乎,你通过简单的百度之后,知道了该怎么向后端发起请求(当然了 也许在前5步的时候,你已经知道了怎么向后端发送请求,并且你有各种不同的姿势来发,什么原生的js啊,vue啊,react啊,jquery啊。各种姿势都不在话下)页面写好了,也知道在页面上怎么向后端发送指令了,现在就差后端接口了。
我刚刚写的java *** 作数据库,花里胡哨的,但是没用啊,我要先接收到前端发给我的指令,我再开始查询,或是各种管理吧。前端都没说话呢,你一顿 *** 作,不是个沙雕吗?好吧,那我的java怎么能接收前端发给我的指令呢?你百度:java >
Visual Basic允许程序员改变一个CommandButton的背景色--简单的将样式设为Graphical然后改变BackColor就行了。但却没有提供一个简单的方法去改变CommandButton的文字的颜色。本文将告诉你怎样根据你的意愿改变CommandButton的文本颜色,而且如果按钮上有的话,还可以将文本显示在按钮的底部。
在工程中添加以下模块(Module):
Module modExtButtonbas
Option Explicit
'==================================================================
' modExtButtonbas
'
' 本模块可让你改变命令按钮的文本颜色。
' 使用方法:
'
' - 在设计时将文本的Style设为Graphical
'
' - 随意设定背景色和图象属性
'
' - 在Form_Load中调用 SetButton :
' SetButton Command1hWnd, vbBlue
' (你可以任意次的调用该过程甚至不必先调用 RemoveButton)
'
' - 在Form_Unload中调用 RemoveButton :
' RemoveButton Command1hWnd
'
'==================================================================
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetParent Lib "user32" _
(ByVal hWnd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = (-4)
Private Declare Function GetProp Lib "user32" Alias "GetPropA" _
(ByVal hWnd As Long, ByVal lpString As String) As Long
Private Declare Function SetProp Lib "user32" Alias "SetPropA" _
(ByVal hWnd As Long, ByVal lpString As String, _
ByVal hData As Long) As Long
Private Declare Function RemoveProp Lib "user32" Alias _
"RemovePropA" (ByVal hWnd As Long, _
ByVal lpString As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
'Owner draw constants
Private Const ODT_BUTTON = 4
Private Const ODS_SELECTED = &H1
'Window messages we're using
Private Const WM_DESTROY = &H2
Private Const WM_DRAWITEM = &H2B
Private Type DRAWITEMSTRUCT
CtlType As Long
CtlID As Long
itemID As Long
itemAction As Long
itemState As Long
hwndItem As Long
hDC As Long
rcItem As RECT
itemData As Long
End Type
Private Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
'Various GDI painting-related functions
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" _
(ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, _
lpRect As RECT, ByVal wFormat As Long) As Long
Private Declare Function SetTextColor Lib "gdi32" (ByVal hDC As Long, _
ByVal crColor As Long) As Long
Private Declare Function SetBkMode Lib "gdi32" (ByVal hDC As Long, _
ByVal nBkMode As Long) As Long
Private Const TRANSPARENT = 1
Private Const DT_CENTER = &H1
Public Enum TextVAligns
DT_VCENTER = &H4
DT_BOTTOM = &H8
End Enum
Private Const DT_SINGLELINE = &H20
Private Sub DrawButton(ByVal hWnd As Long, ByVal hDC As Long, _
rct As RECT, ByVal nState As Long)
Dim s As String
Dim va As TextVAligns
va = GetProp(hWnd, "VBTVAlign")
'Prepare DC for drawing
SetBkMode hDC, TRANSPARENT
SetTextColor hDC, GetProp(hWnd, "VBTForeColor")
'Prepare a text buffer
s = String$(255, 0)
'What should we print on the button
GetWindowText hWnd, s, 255
'Trim off nulls
s = Left$(s, InStr(s, Chr$(0)) - 1)
If va = DT_BOTTOM Then
'Adjust specially for VB's CommandButton control
rctBottom = rctBottom - 4
End If
If (nState And ODS_SELECTED) = ODS_SELECTED Then
'Button is in down state - offset
'the text
rctLeft = rctLeft + 1
rctRight = rctRight + 1
rctBottom = rctBottom + 1
rctTop = rctTop + 1
End If
DrawText hDC, s, Len(s), rct, DT_CENTER Or DT_SINGLELINE _
Or va
End Sub
Public Function ExtButtonProc(ByVal hWnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim lOldProc As Long
Dim di As DRAWITEMSTRUCT
lOldProc = GetProp(hWnd, "ExtBtnProc")
ExtButtonProc = CallWindowProc(lOldProc, hWnd, wMsg, wParam, lParam)
If wMsg = WM_DRAWITEM Then
CopyMemory di, ByVal lParam, Len(di)
If diCtlType = ODT_BUTTON Then
If GetProp(dihwndItem, "VBTCustom") = 1 Then
DrawButton dihwndItem, dihDC, dircItem, _
diitemState
End If
End If
ElseIf wMsg = WM_DESTROY Then
ExtButtonUnSubclass hWnd
End If
End Function
Public Sub ExtButtonSubclass(hWndForm As Long)
Dim l As Long
l = GetProp(hWndForm, "ExtBtnProc")
If l <> 0 Then
'Already subclassed
Exit Sub
End If
SetProp hWndForm, "ExtBtnProc", _
GetWindowLong(hWndForm, GWL_WNDPROC)
SetWindowLong hWndForm, GWL_WNDPROC, AddressOf ExtButtonProc
End Sub
Public Sub ExtButtonUnSubclass(hWndForm As Long)
Dim l As Long
l = GetProp(hWndForm, "ExtBtnProc")
If l = 0 Then
'Isn't subclassed
Exit Sub
End If
SetWindowLong hWndForm, GWL_WNDPROC, l
RemoveProp hWndForm, "ExtBtnProc"
End Sub
Public Sub SetButton(ByVal hWnd As Long, _
ByVal lForeColor As Long, _
Optional ByVal VAlign As TextVAligns = DT_VCENTER)
Dim hWndParent As Long
hWndParent = GetParent(hWnd)
If GetProp(hWndParent, "ExtBtnProc") = 0 Then
ExtButtonSubclass hWndParent
End If
SetProp hWnd, "VBTCustom", 1
SetProp hWnd, "VBTForeColor", lForeColor
SetProp hWnd, "VBTVAlign", VAlign
End Sub
Public Sub RemoveButton(ByVal hWnd As Long)
RemoveProp hWnd, "VBTCustom"
RemoveProp hWnd, "VBTForeColor"
RemoveProp hWnd, "VBTVAlign"
End Sub
将Form命名为frmDemo。添加4个CommandButton,不必更改它们的名称,将它们的Style设为Graphical,给第3个按钮设置一幅。
CommandButton也可以放置在一个容器如PictureBox或Frame中,模块会判断,如果需要的话将CommandButton的容器也子类化。
在Form中加入如下代码:
Private Sub Form_Load()
'Initialize each button color
SetButton Command1hWnd, vbRed
SetButton Command2hWnd, &H8000& '深绿色
'Assign this one a DT_BOTTOM alignment because
SetButton Command3hWnd, vbBlue, DT_BOTTOM '含有,将文本放置在按钮底部
SetButton Command4hWnd, &H8080& '暗棕**
End Sub
Private Sub Form_Unload(Cancel As Integer)
'手动解除按钮的子类化
'这并不是必须的
RemoveButton Command1hWnd
RemoveButton Command2hWnd
RemoveButton Command3hWnd
RemoveButton Command4hWnd
End Sub
1、这不是C语言关键字,只是程序设计者为了方便自己做的宏定义“#DEFINE UINT UNSIGNED INT”,当然可以把它写成其他的字符串,不过还是用这个好,大部分的程序员都用这个,还有UCHAR等,都是类似的。uint在单片机中经常遇到,定义一个无符号整形变量
2、其他常见定义:
typedef unsigned char uint8_t; //无符号8位数
typedef signed char int8_t; //有符号8位数
typedef unsigned int uint16_t; //无符号16位数
typedef signed int int16_t; //有符号16位数
typedef unsigned long uint32_t; //无符号32位数
typedef signed long int32_t; //有符号32位数
typedef float float32; //单精度浮点数
typedef double float64; //双精度浮点数
一般来说整形对应的_t类型为:
uint8_t为1字节
uint16_t为2字节
uint32_t为4字节
uint64_t为8字节
你可以参照这个。
直接用mov指令即可,你可以试一下mov指令输入在符号表中定义为dint,mov输出侧定义为int,300中没有200的转换指令是源于300的mov指令的强大。如果是real型转换成int,你可以将real用round指令转换成dint,然后用mov指令转换成int,这在300系统中通过dp方式外挂200模块,写200模块的地址中会用到。
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
1、数据寄存器数据寄存器主要用来保存 *** 作数和运算结果等信息,从而节省读取 *** 作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的 *** 作可能需要更少时间。可用于乘、 除、输入/输出等 *** 作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。在循环和字符串 *** 作时,要用它来控制循环次数;在位 *** 作中,当移多位时,要用CL来指明移位的位数; 寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的 *** 作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器 *** 作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的 *** 作数和运算结果。它们可作一般的存储器指针使用。在字符串 *** 作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。 32位CPU有2个32位通用寄存器EBP和ESP。它们主要用于访问堆栈内的存储单元,并且规定: EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据; ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器 *** 作数的寻址方式,为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的 *** 作数和运算结果。
4、段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。 CPU内部的段寄存器:
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值; EDS——数据段寄存器(Data Segment Register),其值为数据段的段值; EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值; EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:
实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。 保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。。
5、指令指针寄存器 32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能时,不考虑存在指令队列的情况。
6、标志寄存器
一、运算结果标志位 1、进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位 *** 作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag) 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag) 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字 *** 作时,发生低字节向高字节进位或借位时; (2)、在字节 *** 作时,发生低4位向高4位进位或借位时。对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag) 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag) 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag) 溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
二、状态控制标志位状态控制标志位是用来控制CPU *** 作的,它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag) 当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
2、中断允许标志IF(Interrupt-enable Flag) 中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下: (1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求; (2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。 CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag) 方向标志DF用来决定在串 *** 作指令执行时有关指针寄存器发生调整的方向。具体规定在第5211节——字符串 *** 作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
三、32位标志寄存器增加的标志位 1、I/O特权标志IOPL(I/O Privilege Level) I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
2、嵌套任务标志NT(Nested Task) 嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:
(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回 *** 作;
(2)、当NT=1,通过任务转换实现中断返回。
3、重启动标志RF(Restart Flag) 重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示“接受”调试故障,否则拒绝之。在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。
4、虚拟8086方式标志VM(Virtual 8086 Mode) 如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。
汇编指令集合一、常用指令 1 通用数据传送指令 MOV 传送字或字节 MOVSX 先符号扩展,再传送 MOVZX 先零扩展,再传送 PUSH 把字压入堆栈 POP 把字d出堆栈 PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈 POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次d出堆栈 PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈 POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次d出堆栈 BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节( 至少有一个 *** 作数为寄存器,段寄存器不可作为 *** 作数) CMPXCHG 比较并交换 *** 作数( 第二个 *** 作数必须为累加器AL/AX/EAX ) XADD 先交换再累加( 结果在第一个 *** 作数里 ) XLAT 字节查表转换 BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果 ( [BX+AL]->AL )
2 输入输出端口传送指令 IN I/O端口输入 ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出 ( 语法: OUT {端口号│DX},累加器 ) 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535 3 目的地址传送指令 LEA 装入有效地址 例: LEA DX,string ;把偏移地址存到DX LDS 传送目标指针,把指针内容装入DS 例: LDS SI,string ;把段地址:偏移地址存到DS:SI LES 传送目标指针,把指针内容装入ES 例: LES DI,string ;把段地址:偏移地址存到ESDI LFS 传送目标指针,把指针内容装入FS 例: LFS DI,string ;把段地址:偏移地址存到FSD LGS 传送目标指针,把指针内容装入GS 例: LGS DI,string ;把段地址:偏移地址存到GSDI LSS 传送目标指针,把指针内容装入SS 例: LSS DI,string ;把段地址:偏移地址存到SSDI
4 标志传送指令 LAHF 标志寄存器传送,把标志装入AH SAHF 标志寄存器传送,把AH内容装入标志寄存器 PUSHF 标志入栈 POPF 标志出栈 PUSHD 32位标志入栈 POPD 32位标志出栈
二、算术运算指令 ADD 加法 ADC 带进位加法 INC 加 1 AAA 加法的ASCII码调整 DAA 加法的十进制调整 SUB 减法 SBB 带借位减法 DEC 减 1 NEC 求反(以 0 减之) CMP 比较(两 *** 作数作减法,仅修改标志位,不回送结果) AAS 减法的ASCII码调整 DAS 减法的十进制调整 MUL 无符号乘法 IMUL 整数乘法
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整 DIV 无符号除法 IDIV 整数除法 以上两条,结果回送: 商回送AL,余数回送AH, (字节运算); 或 商回送AX,余数回送DX, (字运算)
AAD 除法的ASCII码调整 CBW 字节转换为字 (把AL中字节的符号扩展到AH中去) CWD 字转换为双字 (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字 (把AX中的字符号扩展到EAX中去) CDQ 双字扩展 (把EAX中的字的符号扩展到EDX中去)
三、逻辑运算指令 AND 与运算 OR 或运算 XOR 异或运算 NOT 取反 TEST 测试(两 *** 作数作与运算,仅修改标志位,不回送结果) SHL 逻辑左移 SAL 算术左移(=SHL) SHR 逻辑右移 SAR 算术右移(=SHR) ROL 循环左移 ROR 循环右移 RCL 通过进位的循环左移 RCR 通过进位的循环右移 以上八种移位指令,其移位次数可达255次 移位一次时, 可直接用 *** 作码 如 SHL AX,1 移位>1次时, 则由寄存器CL给出移位次数 如 MOV CL,04 SHL AX,CL
四、串指令 DS:SI 源串段寄存器 :源串变址 ES I 目标串段寄存器:目标串变址 CX 重复次数计数器 AL/AX 扫描值 D标志 0表示重复 *** 作中SI和DI应自动增量; 1表示应自动减量
Z标志 用来控制扫描或比较 *** 作的结束 MOVS 串传送 ( MOVSB 传送字符 MOVSW 传送字 MOVSD 传送双字 ) CMPS 串比较 ( CMPSB 比较字符 CMPSW 比较字 ) SCAS 串扫描 把AL或AX的内容与目标串作比较,比较结果反映在标志位 LODS 装入串 把源串中的元素(字或字节)逐一装入AL或AX中 ( LODSB 传送字符 LODSW 传送字 LODSD 传送双字 ) STOS 保存串 是LODS的逆过程 REP 当CX/ECX<>0时重复 REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复 REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复 REPC 当CF=1且CX/ECX<>0时重复 REPNC 当CF=0且CX/ECX<>0时重复
五、程序转移指令 1简单的条件转移指令 JZ(或jE) OPR---------------结果为零转移, 测试条件ZF=1 JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0 JS OPR----------------------结果为负转移, 测试条件SF=1 JNS OPR---------------------结果为正转移, 测试条件SF=0 JO OPR--------------------- 溢出转移, 测试条件OF= JNO OPR --------------------不溢出转移 , 测试条件SF=0 JP OPR ---------------------结果为偶转移, 测试条件SF=1 JNP OPR --------------------结果为奇转移 , 测试条件SF=0 JC OPR -------------------- 有进位转移 , 测试条件SF=1 JNC OPR --------------------无进位转移, 测试条件SF=0
2无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移) JB(或JNAE) opd --------------小于或者不大于等于则转移 JNB(或JAE) opd---------------不小于或者大于等于则转移 JA(或NJBE) OPD---------------大于或者不小于等于则转移 JNA(或JBE) OPD---------------不大于或者小于等于则转移
3带符号比较条件转移指令 JL(或JNGE) --------------小于或者不大于等于则转移 JNL(或JGE)--------------不小于或者大于等于则转移 JG(或NJLE)---------------大于或者不小于等于则转移 JNG(或JLE)---------------不大于或者小于等于则转移
六、调用子程序与返回指令 CALL 子程序调用指令 RET 子程序返回指令
六、其它指令 OFFSET -------------------- 返回偏移地址 SEG -------------------- 返回段地址 EQU(=) -------------------- 等值语句 PURGE -------------------- 解除语句 DUP -------------------- *** 作数字段用复制 *** 作符 SEGMENT,ENDS -------------------- 段定义指令 ASSUME -------------------- 段地址分配指令 ORG -------------------- 起始偏移地址设置指令 $ --------------------地址计数器的当前值 PROC,ENDP -------------------- 过程定义语句 NAME,TITLE,END -------------------- 程序开始结束语句 MACRO,ENDM --------------------宏定义指令 XLAT (TRANSLATE) -------------------- 换码指令----
七、条件标志 ZF 零标志 -- 当结果为负时,SF=1,否则,SF=0 AF 辅助进位标志---运算过程中第三位有进位值,置AF=1,否则,AF=0 PF 奇偶标志------当结果 *** 作数中偶数个"1",置PF=1,否则,PF=0 SF 符号标志----当结果为负时,SF=1;否则,SF=0溢出时情形例外 CF 进位标志----- 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,置CF=1;否则,CF=0 OF 溢出标志-----若 *** 作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0
>
以上就是关于编写汇编语言什么软件全部的内容,包括:编写汇编语言什么软件、<!--嵌入代码开始--> <div id="player"></di、开发一个管理系统等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)