汇编初识

栏目: 编程语言 · 发布时间: 2年前

来源: mapan.tech

内容简介:大学时候学习的单片机原理和微机原理有用到汇编语言,但是当时觉得太过晦涩难懂,就没有学太懂。最近开始学习汇编语言,决定把汇编好好学习一下,网友介绍了王爽老师的win10对汇编支持并不友好,索性在虚拟机装了一个XP。折腾汇编环境半天才搞定。首先是带x的寄存器(常用16位寄存器)

本文转载自:https://mapan.tech/posts/c6d9.html,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

大学时候学习的单片机原理和微机原理有用到汇编语言,但是当时觉得太过晦涩难懂,就没有学太懂。最近开始学习汇编语言,决定把汇编好好学习一下,网友介绍了王爽老师的 《汇编语言》 第三版 (提取码nc3c),但为了学习还是买了一本实体书,这样更便于学习和翻阅。

win10对汇编支持并不友好,索性在虚拟机装了一个XP。折腾汇编环境半天才搞定。

首先是带x的寄存器(常用16位寄存器)

AX,BX,CX,DX

另有CS:IP

CS是段寄存器,段寄存器是羞涩的姑娘,不可以直接赋值,只能间接赋值。

CS:IP是当前执行的指令在内存中的地址。IP中存放为偏移地址。

计算方法:指向地址 =(CS)x10H +(IP)

DS是数据 段寄存器

SS为堆栈 段寄存器 SP为堆栈偏移地址,计算方法和CS:IP类似。

每个16位寄存器都是由两个八位寄存器组成,比如AX是有AH和AL组成,以此类推….

最简单且常用的指令有:

指令 作用 举例 含义
MOV 赋值 MOV AX,BX (AX)=(BX)
ADD 加法 ADD AX,CX (AX)=(AX)+(CX)
SUB 减法 SUB AH,BH (AH)=(AH)-(BH)

第一个程序

assume cs:wahaha     ;wahaha程序入口地址

wahaha segment   ;代码段开始

        mov ax,0123h  ; 0123h赋值给AX
        mov bx,0456h  ; 0456赋值给BX
        add ax,bx   ; BX的值加到AX中去
        add ax,ax   ; AX的两倍放到AX中去


        mov ax,4c00h  ;程序结束返回
        int 21h

wahaha ends

end

依次执行 masm 1.asmlink 1.obj 如下图

汇编初识

进如debug进行调试

使用u命令查看汇编指令,使用r命令查看当前当前CPU寄存器的状态,使用t命令执行一条指令,如下图

汇编初识

遇到 int 21 使用p命令进行结束

最后使用q命令退出debug模式

汇编初识

第二个程序:

计算2x2的值,并保存在ax中

assume cs:code
code segment
	mov ax,2   ;把2放到AX中
	add ax,ax  ;AX自加一次,也可以用 inc ax
	
	mov ax,4c00h ; 程序结束,返回
	int 21h
code ends
end

deug查看寄存器中的值,

汇编初识

我们有发现ds:0B26,但是程序存放在0B36起始的地址中,那么这265个(0B36H x 10H - B26H x 10H = 100H)个字节的空间跑哪里去了呢?

其实这256字节的空间叫做PSP,是debug程序需要占用的一段内存。

第三个程序:计算5x4的值

assume cs:wusi
wusi segment
	mov ax,5h   ;赋初值
	mov bx,0h   ;累加到BX,bx置0
	
	add bx,ax    ;第一次累加
	add bx,ax
	add bx,ax
	add bx,ax    ;第四次累加
	
	mov ax,4c00H   ;程序返回
	int 21h
wusi ends             ;这一段程序结束
end                   ;所有程序结束
汇编初识

计算机是非常笨的,他不会做乘法,乘法是通过一次次累加得出的。

计算5x4需要5 累加4次,如果5x100呢?

换个思路100x5,可以用100累加5次,那如果88568x58755呢?难道累加五万多次?

很好,和 C语言 一样,汇编也有自己的循环程序,只需要写一段代码,让他循环五万多次就可以了

下面第四个程序: 计算285x168

assume cs:laila
laila segment
	mov bx,0       ;累加器置零
	mov cx,168     ;循环次数168
	
s:	add bx,286    ;循环体
	loop s        ;若cx不等于0 跳转执行s
		
	mov ax,4c00h   ;程序结束,返回
	int 21h
	
laila ends
end

汇编初识 使用lopp循环168次,循环次数默认存放在CX中

汇编初识

结果是BX中存放的BBB0H

十进制就是48048,可以用计算器验证一下,算的没错。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

关注码农网公众号

关注我们,获取更多IT资讯^_^


查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的呐喊

程序员的呐喊

[美]Steve Yegge / 徐旭铭 / 人民邮电出版社 / 2014-5-1 / 45.00元

《程序员的呐喊》的作者是业界知名的程序员—来自google的steve yegge,他写过很多颇富争议的文章,其中有不少就收录在这本书中。本书是他的精彩文章的合集。 《程序员的呐喊》涉及编程语言文化、代码方法学、google公司文化等热点话题。 对工厂业界的各种现象、技术、趋势等,作者都在本书中表达了自己独特犀利的观点。比如java真的是一门优秀的面向对象语言吗?重构真的那么美好吗?强......一起来看看 《程序员的呐喊》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具