汇编语言(英语:assembly language)是一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。在不同的设备中,汇编语言对应着不同的机器语言指令集。一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以在不同系统平台之间移植。
Lisp(历史上拼写为LISP)是具有悠久历史的计算机编程语言家族,有独特和完全括号的前缀符号表示法。起源于公元1958年,是现今第二悠久而仍广泛使用的高端编程语言。

汇编语言

简介

[1]

汇编语言是最为接近底层的语言(仅次于机器码)。它最初的发明就是为了简化程序员的编程过程,因为直接面对机器码编程是非常痛苦的,这也算是一层语言上的抽象。并且现在很多编程语言都是将文件先编译成汇编语言再编译成机器码,如C语言。

编程语言优先级

语法

跟其他所有的所以自然语言一样,编程语言都有自己的语法,汇编语言也当然不例外。

LABEL OPCODE LOC
上面就是汇编语言的基础语法,可以看到十分简单。接下来我们会从为什么需要这三个部分来分析汇编语言需要这个结构的原因。

首先是LABEL。LABEL字段(可选)是从第一列开始的字母数字字符串。它必须以字母字符(A到Z / a到z)开头,并且它是大小写敏感的。

接着是OPCODE,Operational code 简写,中文名称为操作码。从名字就可以知道,操作码是用来告诉计算机我们需要进行什么操作的代码,通常由4-8字节不等长度组成。通过使用操作码,我们可以告诉计算机我们需要执行什么操作,如加减乘除等。这一块也是ACSL汇编语言的考察重点。

最后是LOC,Location简写,中文名位置。它运用在进行一些操作的时候指定操作变量。

在继续详细的操作码讲解之前,我们还需要知道一个东西,那就是累加器。

累加器

累加器(Accumulator) 一般分为半加器和全加器。但我们不需要区分这些细节。

我们只需要记住:汇编语言的加减法都是在累加器里完成的。所以OPCODE中会涉及到很多把内存中的内容读取到寄存器(Register),然后让累加器进行计算的内容。

接着我们就看一下ACSL为我们定制的汇编语言!

OPCODE

操作码 描述
LOAD LOC里的内容将会被放到累加器,但是LOC内容不变
STORE 将ACC里的内容放回LOC
ADD LOC的值将和ACC里内原有的值相加。和存储在ACC,LOC保持不变
SUB ACC里内原有的值会减去LOC的值。结果存储在ACC,LOC保持不变
MULT ACC的值与LOC的值相乘。结果存储在ACC,LOC保持不变
DIV ACC / LOC. 整数部分存储在ACC,LOC不变

.

BG

逻辑分支,ACC>0时跳转到BG保存的地址(LABEL)

BE

逻辑分支,ACC=0时跳转到BE保存的地址(LABEL)

BL

逻辑分支,ACC<0时跳转到BL保存的地址(LABEL)

BU 无条件跳转到BU保存的地址(LABEL)
READ

将一个整数值读取进入LOC

PRINT

输出LOC的值

DC

LABEL字段必须要存储常数值,此操作码是必填字段,使用后ACC值不变

END

程序结束

Questions

  1. 执行完以下程序之后,TEMP的值是什么
TEMP DC 0
ADC8
BDC-2
CDC3
LOADB
MULTC
ADDA
DIVB
SUBA
STORETEMP
END
  1. 如果以下程序输入值为N,那么X的输出值是什么?用N来表示X
READ X
LOAD X
TOP SUB =1
BE DONE
STORE A
MULT X
STORE X
LOAD A
BU TOP
DONE END

Solutions

  1. The ACC takes on values -2, -6, 2, -1, and -9 in that order. The last value, -9, is stored in location TEMP.
  2. This program loops between labels TOP and DONE for A times. A has an initial value of X and subsequent terms of N, then values of A-1, A-2, …, 1. Each time through the loop, X is multiplied by the the current value of A. Thus, X = A * (A-1) * (A-2) * … * 1 or X=A! or A factorial. For example, 5! = 5 * 4 * 3 * 2 * 1 = 120. Since the initial value of A is the number input (i.e. N), the algebraic expression is X = N!.

LISP

简介

[2]

Lisp(历史上拼写为 LISP)是具有悠久历史的计算机编程语言家族,有独特和完全括号的前缀符号表示法。起源于公元 1958 年,是现今第二悠久而仍广泛使用的高端编程语言。只有 FORTRAN 编程语言比它更早一年。Lisp 编程语族已经演变出许多种方言。现代最著名的通用编程语种是 Clojure、Common Lisp 和 Scheme。

LISP语言的基础就是list。list可以通过把各种元素(数字,文字等)放在括号内,如:

(23 (this is easy) hello 821)

在list里面的元素被称为atoms,上面这个例子所含有的atoms按顺序读出即为:23, 'this, 'hello, 821, 'easy, 和 'is。可以看到字母前面都会有一个**'**符号。所有在LISP里的元素都是一个list或者atom,除了NIP(可以用一个空括号()表示)

括号里也可以进行函数调用,比如说(ADD 2 3)就是2 + 3,(MULT 4 5)就是4 * 5,具体操作符将在接下来的章节讲。

函数

基本函数

SETQ与SET大致相同,唯一不同之处在于第一个args用SETQ不需要在前面加'

语句注解
(SET 'a (MULT 2 3)) 6 a = 6
(SET 'a '(MULT 2 3)) (MULT 2 3) a = (MULT 2 3)
(SET 'b 'a) a b = 'a', a character not a mentioned before
(SET 'c a) (MULT 2 3) c = (MULT 2 3)
(SETQ EX (ADD 3 (MULT 2 5))) 13 EX = 13
(SETQ VOWELS '(A E I O U)) (A E I O U) VOWELS = (A E I O U)

根据上面的表格,我们可以知道只要有'出现,就意味着这个值是以字符传递的。

语句注解
(SETQ p '(ADD 1 2 3 4)) (ADD 1 2 3 4) p = (ADD 1 2 3 4)
(ATOM 'p) true ATOM 会判断p是否是ATOM
(ATOM p) NIL 因为p前面没有',他指的是列表
(EVAL p) 10 EVAL会计算p中表达式的值

计算函数

函数结果
(ADD x1 x2 …) 所有参数的和
(SUB a b) a - b
(MULT x1 x2 …) 所有参数的积
(DIV a b) a / b
(SQUARE a) a * a
(EXP a n) an
(EQ a b) true如果a和b相等, NIL不相等
(POS a) true如果是正数positive, NIL则是negative
(NEG a) true如果是负数negative, NIL则是positive

同时,跟正常计算一样,括号内的优先级最高。

语句
(ADD (EXP 2 3) (SUB 4 1) (DIV 54 4)) 24.5
(- (* 3 2) (- 12 (+ 1 2 1))) -2
(ADD (SQUARE 3) (SQUARE 4)) 25

list function

CAR: 返回list第一个atom
CDR:输出一个list,排除第一个atom
CONS:两个参数,第二个必须是list。CONS会把第一个参数放进第二个列表里的第一个元素
REVERSE:将list的顺序反过来
CADR x = (CAR (CDR x))
CAADDAR x = (CAR (CAR (CDR (CDR (CAR x))))),以此类推……

语句
(CAR '(This is a list)) This
(CDR '(This is a list)) (is a list)
(CONS 'red '(white blue)) (red white blue)
(SETQ z (CONS '(red white blue) (CDR '(This is a list)))) ((red white blue) is a list)
(REVERSE z) (list a is (red white blue))
(CDDAR z) (blue)

User-defined Functions

(DEF SECOND (args) (CAR (CDR args)))

它定义了一个名为SECOND的新函数,该函数对名为“ args”的单个参数进行操作。SECOND将调用CDR,然后调用CAR。

Problems

From ACSL Assembly language & ACSL LISP:

  1. Evaluate the following expression. (MULT (ADD 6 5 0) (MULT 5 1 2 2) (DIV 9 (SUB 2 5)))
  2. Evaluate the following expression: (CDR '((2 (3))(4 (5 6) 7)))
  3. Consider the following program fragment:
    (SETQ X '(RI VA FL CA TX))
    (CAR (CDR (REVERSE X)))
    What is the value of the CAR expression?

Solutions

  1. (MULT (ADD 6 5 0) (MULT 5 1 2 2) (DIV 6 (SUB 2 5)))
    (MULT 11 20 (DIV 6 -3))
    (MULT 11 20 -2)
    -440

  2. The CDR function takes the first element of its parameter (which is assumed to be a list) and returns the list with the first element removed. The first element of the list is (2 (3)) and the list without this element is ((4 (5 6) 7)), a list with one element.
  3. The first statement binds variable X to the list '(RI VA FL CA TX). The REVERSE of this list is '(TX CA FL VA RI) whose CDR is '(CA FL VA RI). The CAR of this list is just the atom CA (without the quote).

注:如果文中有什么问题,欢迎在评论区指出;有不懂的也可以在评论区提问哦!


  1. 维基百科-汇编语言↩︎

  2. 维基百科-LISP↩︎