assume cs:code,ds:data
data segment
num db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h
sum db ?
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,offset num
mov cx,10
xor al,al
next: add al,[bx]
inc bx
loop next
mov sum,al
mov ax,4c00h
int 21h
code ends
end start
这个程序不难的
说明一点:10个数据的和应该是04b5h,但是因为sum是字节变量,所以只能存储b5h。
如果希望能够完整保存相加的和,则应该把sum定义成字类型。程序如下:
assume cs:code,ds:data
data segment
num db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h
sum dw ?
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,offset num
mov cx,10
xor ax,ax
xor dh,dh
next: mov dl,[bx]
add ax,dx
inc bx
loop next
mov sum,ax
mov ax,4c00h
int 21h
code ends
end start
汇编语言
显然,汇编是第一个计算机语言。汇编语言实际上是你计算机处理器实际运行的指令的命令形式表示法。这意味着你将与处理器的底层打交道,比如寄存器和堆栈。如果你要找的是类英语且有相关的自我说明的语言,这不是你想要的。
确切的说,任何你能在其他语言里做到的事情,汇编都能做,只是不那么简单 — 这是当然,就像说你既可以开车到某个地方,也可以走路去,只是难易之分。话虽不错,但是新技术让东西变得更易于使用。
总的来说,汇编语言不会在游戏中单独应用。游戏使用汇编主要是使用它那些能提高性能的零零碎碎的部分。比如说,毁灭战士整体使用C来编写,有几段绘图程序使用汇编。这些程序每秒钟要调用数千次,因此,尽可能的简洁将有助于提高游戏的性能。而从C里调用汇编写的函数是相当简单的,因此同时使用两种语言不成问题。
特别注意:语言的名字叫“汇编”。把汇编语言翻译成真实的机器码的工具叫“汇编程序”。把这门语言叫做“汇编程序”这种用词不当相当普遍,因此,请从这门语言的正确称呼作为起点出发。
优点:最小、最快的语言。汇编高手能编写出比任何其他语言能实现的快得多的程序。你将是利用处理器最新功能的第一人,因为你能直接使用它们。
缺点:难学、语法晦涩、坚持效率,造成大量额外代码 — 不适于心脏虚弱者。
移植性:接近零。因为这门语言是为一种单独的处理器设计的,根本没移植性可言。如果使用了某个特殊处理器的扩展功能,你的代码甚至无法移植到其他同类型的处理器上(比如,AMD的3DNow指令是无法移植到其它奔腾系列的处理器上的)。
使用汇编编写的游戏:我不知道有什么商业游戏是完全用汇编开发的。不过有些游戏使用汇编完成多数对时间要求苛刻的部分。
资料:如果你正在找一门汇编语言的文档,你主要要找芯片的文档。网络上如Intel、AMD、Motorola等有一些关于它们的处理器的资料。对于书籍而言,《Assembly Language: Step-By-Step》是很值得学习的。
assume
cs:code,ds:data
data
segment
num
db
12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h
sum
db
?
data
ends
code
segment
start:
mov
ax,data
mov
ds,ax
mov
bx,offset
num
mov
cx,10
xor
al,al
next:
add
al,[bx]
inc
bx
loop
next
mov
sum,al
mov
ax,4c00h
int
21h
code
ends
end
start
这个程序不难的
说明一点:10个数据的和应该是04b5h,但是因为sum是字节变量,所以只能存储b5h。
如果希望能够完整保存相加的和,则应该把sum定义成字类型。程序如下:
assume
cs:code,ds:data
data
segment
num
db
12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h
sum
dw
?
data
ends
code
segment
start:
mov
ax,data
mov
ds,ax
mov
bx,offset
num
mov
cx,10
xor
ax,ax
xor
dh,dh
next:
mov
dl,[bx]
add
ax,dx
inc
bx
loop
next
mov
sum,ax
mov
ax,4c00h
int
21h
code
ends
end
start