汇编不会编
文章平均质量分 87
筱羊冰冰
这个作者很懒,什么都没留下…
展开
-
汇编——分支结构几种常见格式(多分枝、逻辑分解、跳表法和转移表法)
前言之前提过了分支结构的跳转指令,也给出了一部分的分支结构,这里我们给出一份比较完全的格式。(原文章链接,点击查看跳转指令大全)格式多分枝比如我需要比较一个数据和0相比的结果:(这里我们采用的是jg,为有符号数的比较方式,所以是可以和0比较大小的)X DB ? ;被测数据Y DB ? ;函数值单元…… MOV AL, 0 CMP X, AL JG BIG JZ SAV ;等于0 MOV AL, 0FFH ;小于0 JMP SAVBIG: MOV AL, 1 ;原创 2021-01-06 21:41:20 · 2554 阅读 · 0 评论 -
汇编——实现冒泡排序+讲解
题目描述&代码有一个首地址为A的N字数组,编写程序采用冒泡排序使该数组中的数按照从大到小的次序整序。数据存储在A的数组中(即内存中),我们需要利用冒泡排序实现从大到小排序。;descriptiondata SEGMENT USE16 a dw 8,16,41,22,50 n equ ($-a)/2data ENDS;descriptionstack SEGMENT USE16 dw 32 dup(?)stack ENDS;description原创 2021-01-06 20:37:22 · 9294 阅读 · 0 评论 -
汇编——重复汇编怎么写
什么是重复汇编当我们想生成一系列的相同或相近代码,我们就可以使用重复汇编的方式。结构:REPT 整数表达式 重复体ENDM其中整数表达式的值为循环次数。比如我们需要设置一个1-10的bd类型: X=0REPT 10 X = X+1 DB XENDM或者我们采取重复汇编将A到Z填入数组table中:CHAR = ‘A’TABLE LABEL BYTEREPT 26 DB CHAR CHAR = CHAR+1ENDM其中的label标签是不会分配地址的,原创 2021-01-06 10:21:18 · 560 阅读 · 0 评论 -
汇编——十六进制输入转换十进制输出(附加输入检测)
题目描述输入一个最大长度为4的十六进制数,将其转换成10进制输出。其中我们需要检测十六进制输入的正确性,比如大小写、特殊字符和数字的判断。解决方式程序分为两个部分,首先是处理我们的输入,以及通过除法计算十进制数的过程。data SEGMENT USE16 data ENDSstack SEGMENT USE16 db 32 dup(?)stack ENDScode SEGMENT USE16 ASSUME CS:CODE, DS:DATA, SS:STA原创 2021-01-05 22:33:52 · 5158 阅读 · 1 评论 -
汇编——十进制数据输入转二进制/十六进制输出(含数字判断,不限位数)
题目描述输入一串十进制数,需要判断是否为数字,并将其转化成二进制和十六进制输出。代码:二进制:;descriptiondata SEGMENT data ENDS ;descriptionstack SEGMENT stack ENDS;descriptioncode SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK start: mov ax,data mov ds,ax原创 2021-01-05 17:12:16 · 7009 阅读 · 1 评论 -
汇编——宏应该怎么写
什么是宏原创 2021-01-04 16:02:04 · 3187 阅读 · 0 评论 -
汇编——子程序应该怎么写、子程序传参、Fibonacci递归举例
在学习子程序的过程中,看了整个的ppt,也没搞明白一个带有子程序的汇编程序长什么样。我们先看一个例子,然后分析。datas segment w dw 10 h dw 6 turns dw 30 start_x dw 20 start_y dw 20datas endsstack segment stack dw 32 dup(?)stack endscode segment assume cs:code,ds:datas,原创 2021-01-04 14:59:05 · 5128 阅读 · 1 评论 -
汇编——跳转指令与分支结构(包括OF和CF的溢出判断)
汇编中的循环和分支结构虽然我们没有花里胡哨的函数和对象等等,但是我们也可以实现循环和分支结构(其实就是if_else)我们要知道一个问题,就是代码是一行行执行的。(其实这个是说给我这样的被Verilog降维打击的人听的)如果是循环,我们就要想办法在执行完一次循环就跳转到循环开始,同时改变一些条件,方便进行跳出循环。再加上初始值,循环三要素就出来了。如果是if_else,那么我们就需要进行判断,然后选择我们要执行的代码,直接将ip指针(控制代码执行到的位置的寄存器)切到指定位置,就能实现功能了。原创 2021-01-04 12:04:36 · 3802 阅读 · 0 评论 -
汇编——dosbox的debug常用指令
举例这里我们采用 hello world 的程序举例。首先复制到记事本,修改文件名为hello.asm。;完整段的Hello World程序DATAS SEGMENT STRING DB 'Hello World!',13,10,'$' ;13为回车,10为换行,$为字符串默认结束符DATAS ENDSCODES SEGMENT ASSUME CS: CODES, DS: DATASSTART: MOV AX, DATAS MOV原创 2021-01-03 20:50:52 · 5074 阅读 · 0 评论 -
汇编——dosbox的使用以及文件的运行
上汇编实验,用了一下dosbox和masm for windows集成环境,那叫一个刺激。现在来分享一下。(masm的集成环境就算了,感觉还不如自己手动绑定呢)安装dosbox百度网盘分享提取码:xybb里面有dosbox的exe文件,直接点击使用就行了。貌似是因为我调整过了,所以不需要修改窗口大小。(虚拟机上测试的)如果是想下载一个,那么就按照下面的连接:百度网盘分享提取码同上。注意我们,下载的dosbox没有我们需要的将asm文件处理的内容,所以还是需要下载上面的masm文件夹!调原创 2020-12-29 12:29:32 · 8194 阅读 · 0 评论 -
汇编——操作符和常用指令
操作符操作符分为四大类,算数操作符、关系操作符、数值回送操作符和属性操作符。注:这里指的是[sp+8]这样的加法,而不是我们的add指令。算数操作符加减乘除和求模,这个就不说了。关系运算符EQ 等于NE 不等于LT 小于LE 小于等于GT 大于GE 大于等于注记:有E的就含有等于项。如果为真,返回0fffh,否则为0000h。其实这个不太常见,一般比较的时候,我们都是配合跳转指令来的,而跳转指令中直接cmp比较,然后看标志位就行了。(其实标志位都不需要你看,直接使用对应的跳原创 2021-01-02 21:12:53 · 4222 阅读 · 0 评论 -
汇编——寄存器的分类和功能
在汇编中,个人感觉最重要的部分其实就是寄存器了,这次我们了解一下寄存器的分类和功能。先说一下寄存器是什么吧,其实就是一部分的空间,我们可以使用这些空间来存储内容。寄存器的空间都是16位的(80x86中,后来有增长),也就是1个字的空间。堆栈则有一点不一样,我们的堆栈空间是在程序中定义的,可以存储很多个16位二进制数。注意事项堆栈的栈顶指针最开始是在栈顶的,栈顶为高位,也就是存储是从高到低的。我们压栈出栈的过程本质上其实就是将我们寄存器的内容进行复制,而不是将寄存器就行移动(不会真的有人感觉是将原创 2021-01-01 20:59:45 · 3977 阅读 · 2 评论 -
汇编程序怎么写?
每一个汇编老师都会告诉你很多强的亚批的指令,但是不怎么说一个真正的、能跑起来的汇编程序长什么样。在我学习的过程中,虽然有基本格式的讲解,但是说实话听着就很难受。这也导致在上汇编实验的过程中,是属是难受。从一个小程序说起不是微信小程序啊,是比较短的汇编程序。例:result=a+bdata segment a db 1 b db 2 result db ? string db 'result=$’data ends code segment assume cs:原创 2020-12-30 16:41:06 · 7248 阅读 · 0 评论 -
汇编——存储器取数据和地址跳转的寻址方式
前言在编写汇编代码的时候,我们经常需要取出各种各样的数据,进行操作,但是有的数据常数(这里叫立即数),还有的在寄存器中,都是很简单的,但是难免有一些在存储器中,这时我们就需要取出数据进行操作。在分支结构或者循环结构中,我们可能需要跳过几行(if else语句)或者回到几行之间(循环),所以我们需要修改存储当前指令的IP寄存器,为其赋值的过程中我们就需要赋值,道理同上。在例子中,我们经常使用的是mov ax,……,这里要说明一下,寻址方式不一定非要是mov指令,而且mov指令这样的两个操作数都可以采原创 2020-12-30 11:04:13 · 4892 阅读 · 0 评论