本文解答王爽《汇编语言》实验5的(5)(6)题
同时给出一些常见问题的解答
以及给出最易犯错的地方:数据类型不匹配的解决方案
将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
8 + 8
存在进位,不过没有超范围,不影响mov
指令传送数据最方便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
用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
算法流程模型不再赘述,只需要
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
对于开头的地方,需要注意,以下是对的:
assume ds:data1,ds:data2,ds:data3
不可以用以下省略!没有这种省略!
assume ds:data1,data2,data3
这表明,段寄存器:段
是一体的,这两个东西的组合,共同表明了段的类型,不可以连写。
任何程序设计,都要先设计,再实现,不要一上来就实现!一上来就敲代码的唯一结果,就是反复返工,浪费时间。
且问题复杂度越大,浪费时间越多,危害也就越大,例如在历史上,软件工程发展初级阶段,放疗设备的软件失误导致多人死亡,这个故事足以让你明白需求分析和设计的重要性。
这里想强调,push
和pop
指令的本质就是数据传送指令,它们与mov
的本质没有区别,只不过对其的设计的为了专门的堆栈应用而已,但这不代表你只能将其应用于堆栈。
例如最开篇的题目,如果你使用push\pop
指令,是完全可以实现的,不过第一题确实没有必要多此一举。
对于此处的讲解,我单独放了一篇文章,给到你链接
汇编语言程序设计,如何避免数据类型匹配错误