IBM - PC 汇编语言程序设计复习
期末复习汇编… 真的是好努力的复习… 实验老师让我们做的那几个实验,想想还觉得谢谢了~ 谈一下输入输出、分支流程、基本指令,再谈一下做过的几个题目。
输入输出
整数的 ASCII 码值转为数值
- 0-9 30H-39H
可以减去 30H 或者 与上 1111 (15) - A-F 41H-46H
减去 37H (55) - a-z 61H-66H
减去 57H (75)
输入一位十六进制整数
1 | IN_1_HEX: |
输入两位十六进制整数
两位十六进制表示的值最多是 FF ,也就是 255,用八位就可以存下。
1 | IN_2_HEX: |
输入一位十进制整数
实际使用的时候记得要保护之前的数据,先 PUSH 再 POP
1 | IN_1_DEC: |
输入两位十进制整数
1 | IN_2_DEC: |
输出一位十六进制整数
1 | DISP_1_HEX: |
输出两位十六进制整数
1 | DISP_2_HEX: |
输出一位十进制整数
1 | DISP_1_DEC: |
输出两位十进制整数
1 | DISP_2_DEC: ; DL 除十取余法 |
带符号位的输出多位十进制整数
1 | DISP: ; 用十进制出AX中的数 |
循环分支结构
比较
最重要的就是 比较,
TEST,AND,CMP,SUB 还有等等等等… 都可以拿来做比较。
TEST 指令
指令格式:TEST DST, SRC TEST 指令可以被用来检测某一位是否为 1,因为其本质就是与运算,也就是 DST & SRC,但是不改变源操作数和目标操作数。
如 00010000 & X 的结果就表示 X 的倒数第五位是否为 1,要是与出来为 0,就说明这一位为 0,否则为 1。
CMP 指令
指令格式:CMP DST, SRC
可以比较两个数的大小,本质就是减法运算,也就是 DST - SRC,但是不改变源操作数和目标操作数。
跳转指令
这里的就是判断被比较的两个数的具体大小,然后决定执行哪一句。
C-style 的语言中是这样:
1 | if (a > b){ |
汇编中呢,就是:
1 | CMP AX, BX |
上面的 JA 就是一个跳转指令,再详细的各种指令我就不说了,看书~ 下面稍微说几个记得牢的~
- JE 两个数相等
- JNE 两个数不相等
- JA 无符号 前者大于后者我是这样记得, A 就是两个比较的数里前面那个,B 就是两个比较的数里后面那个,所以
JA就是前面的大。 - JG 有符号比较,前者大于后者 G 的意思就是 greater than
- JB 无符号 前者小于后者
- JL 有符号比较 前者小于后者 L = less than
- JAE 无符号大于等于
- JGE 有符号大于等于
- JBE 无符号小于等于
- JLE 有符号小于等于
二进制转十六进制
我们都知道,一位十六进制可以表示四位二进制,所以要把二进制转为十六进制的画,得每四位每四位的转换。大概流程如下
1 | digraph g { |
控制转移指令
书上 P85
题目
输入二十位带符号十六进制数,排序后输出十进制最大数、最小数、次大数、次小数
1 | DATA SEGMENT |