汇编笔记以及实验4

#汇编笔记以及实验4

最近在重温汇编,之前看汇编还是在大黑书上,看了一点X86的,现在算是系统的学习一下汇编,用的书是王爽的《编译原理》

首先就是Debug的使用,win10上不自带Debug,需要自己下载,很简单,一搜教程一大堆。

  • R 查看,改变cpu寄存器的内容,比如只有一个r是查看所有,r ax则是修改ax的内容
  • D 查看内存中的内容,比如d 1000:0 查看内存1000:0后128个内存单元的内容。 d 1000:0 9查看内存1000:0 到1000:9的内容
  • E 改写内存中的内容,比如e 1000:0 1 2 3 4 5 6 7 8 9修改从1000开始十个单元的内容
  • U 查看内存中机器码对应的汇编指令 如u 1000:0
  • T 执行cs:ip指向的指令
  • A 以汇编指令的形式在内存中写入指令,如a 1000:0,然后依次输入指令
  • P 退出程序

然后是常用寄存器:

CS和IP是8086CPU中两个关键的寄存器,它们指示了CPU当前要读取指令的地址。

CS:代码段寄存器;IP:指令指针寄存器。任意时刻,CPU将CS:IP指向的内容当作指令来执行。

DS:调用命令如mov ax,[0]时,默认段地址存在ds中,[0]即DS:0。

SS SP 都是对于堆栈段来说的,ss里面存放堆栈段的段地址,sp存放偏移地址。

源程序被执行的过程:

  1. 首先是编写源程序,如用记事本等。
  2. 然后对源程序进行编译连接。使用汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件.
  3. 再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。

可执行文件包含两部分内容。

  • 程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
  • 相关的描述信息(比如,程序有多大、要占用多少内存空间等)

最后执行可执行文件中的程序。

然后是实验四,先自己写了一遍,感觉没什么大问题,但是看了网上大佬的解答发现自己还是太粗心了,先来看看题目

(1)编程,向内存0:2000:23F依次传送数据063(3FH)。

(2)编程,向内存0:2000:23F依次传送数据063(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4c00h”和“ int 21h”。

其实第一问和第二问是一样的,如果使用循环的话,代码如下

assume cs:code

code segment

	mov ax,0020h
	mov ds,ax
	
	mov bx,0
	
	mov cx,64
	
s:  mov [bx], bx
	inc bx
	loop s
	
	mov ax,4c00h
	int 21h
	
code ends
end

问题在 mov [bx], bx 这里,更准确的用法应该是mov [bx], bl 因为bx是十六位寄存器,而ds:bx是一个字节单位(八位),所以写入的时候一次会写入两个内存单位。在采用小端法(最低有效位在前)的机器上写入的时候。

比如初始化后为

FF FF FF FF 第一次循环写入00,结果为

00 00 FF FF 第二次循环写入01,结果为

00 01 00 FF 第三次循环写入02,结果为

00 01 02 00 这是没什么问题的

但如果在采用大端法(最高有效位在前)的机器上写入,就会出现问题

FF FF FF FF 第一次循环写入00,结果为

00 00 FF FF 第二次循环写入01,结果为

00 00 01 FF 第三次循环写入02,结果为

00 00 00 02 会发现由于每次写入两个内存单元,会导致前一次被写入的后两位被覆盖,从而产生错误结果,所以改用八位的bl寄存器,这样可以避免这种情况。

这是原文链接

不得不说,还有很多地方需要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值