【汇编语言】王爽实验5(5)(6)的解答 & 建立数据类型匹配的观念

0 前言

本文解答王爽《汇编语言》实验5的(5)(6)题

同时给出一些常见问题的解答

以及给出最易犯错的地方:数据类型不匹配的解决方案

1 题目解答

1.1 实验5(5)

1.1.1 题目

将data1和data2段的数据依次相加,结果放入data3段

data1 segment
	db 1,2,3,4,5,6,7,8 
data1 ends

data2 segment
	db 1,2,3,4,5,6,7,8
data2 ends

data3 segment
	db 0,0,0,0 ,0,0,0,0
data3 ends

1.1.2 题目解析

  1. 数据是字节型数据,注意寄存器使用al、ah系列寻址要+1
  2. 8 + 8存在进位,不过没有超范围,不影响
  3. 此处使用mov指令传送数据最方便
  4. 内存连续的数据,用循环

重要的:程序算法设计(无论多简单,都不能忽视!)
【汇编语言】王爽实验5(5)(6)的解答 & 建立数据类型匹配的观念_第1张图片

1.1.3 代码

assume ds:data1,ds:data2,ds:data3
data1 segment
	db 1,2,3,4,5,6,7,8 ; 8 + 8 = 10H 一个字节放得下,没事!
data1 ends

data2 segment
	db 1,2,3,4,5,6,7,8
data2 ends

data3 segment
	db 0,0,0,0 ,0,0,0,0
data3 ends

assume cs:code
code segment
start:
	mov ax,data1
	mov ds,ax
	
	mov bx,0
	mov cx,8
	s:
		mov al,[bx]  ; 这种语法格式,很容易让人忽略【数据类型】,还是AT&T格式好
		add al,[bx + 10h]
		mov [bx + 20h],al
		add bx,1
		loop s
	
	mov ax,04c00h
	int 21h
code ends
end start

1.1.4 代码注意事项

  1. 字节型数据,对应使用8位寄存器,不是16位!
  2. 内存中连续的字节型数据,应该是bx + 1,不是+2
  3. 可以查一查AT&T格式的x86汇编语言,这种格式,要求操作助记符指明操作数的数据类型,这样一来,你根本不会出错,通常这种格式在Linux操作系统使用。

1.2 实验5(6)

1.2.1 题目

用push指令将data1段的前8个字型数据,逆序放入data2段

data1 segment
	dw 1,2,3,4, 5,6,7,8,  9,0ah,0bh,0ch,  0dh,0eh,0fh,0ffh
data1 ends

data2 segment
	dw 0,0,0,0,  0,0,0,0
data2 ends

1.2.2 题目解析

  1. 字型数据,寄存器使用AX系列,连续内存单元访问要 +2
  2. 逆序,需要使用栈
  3. 注意栈顶SS:SP的位置和DS:EA的位置

以下是设计模型
【汇编语言】王爽实验5(5)(6)的解答 & 建立数据类型匹配的观念_第2张图片

算法流程模型不再赘述,只需要

  1. 将SS:SP和DS:EA指定到对应位置
  2. 注意要 +2

1.2.3 代码

assume ds:data1,ds:data2
data1 segment
	dw 1,2,3,4, 5,6,7,8,  9,0ah,0bh,0ch,  0dh,0eh,0fh,0ffh
data1 ends

data2 segment
	dw 0,0,0,0,  0,0,0,0
data2 ends

assume cs:code
code segment
start:
    mov ax,data2
	mov ss,ax
	mov sp,10h
	
	mov ax,data1
	mov ds,ax
	mov bx,0
	
	mov cx,8
	s:
		push [bx]
		add bx,2
		loop s
	
	mov ax,04c00h
	int 21h
code ends
end start

1.3 其他语法的注意事项

对于开头的地方,需要注意,以下是对的:

assume ds:data1,ds:data2,ds:data3

不可以用以下省略!没有这种省略

assume ds:data1,data2,data3

这表明,段寄存器:段是一体的,这两个东西的组合,共同表明了段的类型,不可以连写

2 由题目获得的重要思想观念

2.1 需求分析与程序设计的重要性

任何程序设计,都要先设计,再实现,不要一上来就实现!一上来就敲代码的唯一结果,就是反复返工,浪费时间。

且问题复杂度越大,浪费时间越多,危害也就越大,例如在历史上,软件工程发展初级阶段,放疗设备的软件失误导致多人死亡,这个故事足以让你明白需求分析和设计的重要性。

2.2 把握指令本质,实现灵活应用

这里想强调,pushpop指令的本质就是数据传送指令,它们与mov的本质没有区别,只不过对其的设计的为了专门的堆栈应用而已,但这不代表你只能将其应用于堆栈。

例如最开篇的题目,如果你使用push\pop指令,是完全可以实现的,不过第一题确实没有必要多此一举。

2.3 避免数据类型匹配错误的解决方案

对于此处的讲解,我单独放了一篇文章,给到你链接

汇编语言程序设计,如何避免数据类型匹配错误

你可能感兴趣的:(汇编语言)