35、设计一种无符号二进制整数的减法方法。通过从二进制数 10001000 中减去二进制数 00000101 来测试你的方法,得到结果 10000011。再用至少另外两组整数测试你的方法,且总是用较小的值减去较大的值。
一种减法方法是将被减数取反加 1 后与减数相加,并忽略最高位的进位。例如从 10001000 中减去 00000101 ,先将 00000101 取反得到 11111010 ,再加 1 得到 11111011 ,然后与 10001000 相加:
10001000
+ 11111011
= 1 10000011
忽略最高位进位后结果为 10000011 。
另外两组测试:
- 从
11001100中减去00110011,00110011取反加 1 后为11001101,
11001100
+ 11001101
= 1 10011001
忽略进位后结果为 10011001 。
- 从
10101010中减去00001010,00001010取反加 1 后为11110110,
10101010
+ 11110110
= 1 10100000
忽略进位后结果为 10100000 。
36、请给出三个不同的指令助记符示例。
mov、add、sub
37、什么是调用约定,它在汇编语言声明中是如何使用的?
调用约定
调用约定是指调用过程的底层细节,需考虑的细节包括:
- 被调用过程必须保留哪些寄存器;
- 传递参数的方法(寄存器、栈、共享内存等);
- 调用程序向过程传递参数的顺序;
- 参数是按值传递还是按引用传递;
- 过程调用后栈指针如何恢复;
- 函数如何向调用程序返回值。
在汇编语言声明中,调用约定规定了参数传递和栈清理的标准化顺序。
例如:
- C调用约定 :C和C++语言使用,子程序参数以逆序压入栈;
- STDCALL调用约定 :描述了调用Windows API函数的协议。
不同语言调用汇编语言过程时,外部标识符需有兼容的命名约定,以保证链接器能正确解析引用。
38、如何在程序中为栈预留空间?
可以使用 STACK 指令为栈预留足够的空间。例如在 Irvine32 库中,使用 .stack 4096 预留 4096 字节的栈空间;通常情况下,使用 .STACK 200h 指令可预留 512 字节。
39、解释大端序(big endian)和小端序(little endian)的区别,并查找该术语的起源。
字节序(Endianness)
大端序是指数据的高位字节存于低地址,低位字节存于高地址,即按从高到低的顺序存储;小端序则相反,数据的低位字节存于低地址,高位字节存于高地址,按从低到高的顺序存储。
例如对于十六进制数 12345678h ,
- 大端序 存储顺序为: 12h 、 34h 、 56h 、 78h
- 小端序 存储顺序为: 78h 、 56h 、 34h 、 12h
起源
关于该术语的起源,它源自乔纳森·斯威夫特的小说《格列佛游记》,书里小人国因为吃鸡蛋先打破大端还是小端产生了分歧,计算机领域借用这个概念描述字节存储顺序。
40、为什么你会在代码中使用符号常量而不是整数文字量?
符号常量不占用存储,其值在运行时不会改变,仅在汇编程序扫描程序时使用;而整数文字量可能不具备这些特性,所以使用符号常量能避免存储占用和运行时的值改变问题。
41、源文件和列表文件有什么不同?
源文件是程序的原始代码,而列表文件包含程序源代码副本、行号、每条指令的数字地址、每条指令的机器码字节(十六进制)以及符号表。符号表包含所有程序标识符、段的名称及相关信息。
42、数据标签和代码标签有什么不同?
数据标签用于标识变量的位置,方便在代码中引用变量,无特殊结尾字符;代码标签位于程序的代码区域,用于跳转和循环指令的目标,必须以冒号(:)结尾。
43、标识符不能以数字开头。判断这句话是否正确,并说明原因。
这句话是正确的。这是编程领域的常见规则。在许多编程语言里,标识符用于命名变量、函数、类等元素,为保证语法清晰和避免与数字常量混淆,规定不能以数字开头。例如在 Python、Java、C++ 等语言中都遵循此规则。
44、汇编语言指令在运行时执行。
错误,存在非运行时执行的汇编语言指令,并非所有汇编语言指令都在运行时执行。
二进制减法与汇编语言核心概念解析

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



