编程题:
编制一个程序片断,把保存在变量dataA和dataB中较大的数据取出后存入maxC。假设变量存放的是32位有符号数。
OV AX, DATA ; 段初始化 MOV DS, AX MOV AX, STACK MOV SS, AX MOV DX, WORD PTR BUFA+2 ; 按题意,将数送入 DX,AX, BX, CX MOV AX, WORD PTR BUFA MOV BX, WORD PTR BUFB+2 MOV CX, WORD PTR BUFB CMP DX, BX ; 先比高位字 JG MOVE_A ; A 大 JL MOVE_B ; B 大 CMP AX, CX ; 高位字相等就再比低位字 JAE MOVE_A ; A 大 JMP MOVE_B ; B 大 MOVE_A: MOV WORD PTR BUFC+2, DX ; A 大 MOV WORD PTR BUFC, AX JMP EXIT MOVE_B: MOV WORD PTR BUFC+2, BX ; B 大 MOV WORD PTR BUFC, CX EXIT: |
MASM汇编语言中,在数据段如下定义了一个数组,请在代码段为其全部赋予初值1。.data number = 500 array byte number dup(?) .code
; 数据段 .data number = 500 array byte number dup(?) ; 代码段 .code main PROC ; 将数组中的每个元素赋值为1 mov ecx, number mov esi, offset array mov al, 1 rep stosb ; 其他代码... main ENDP END main |
用一条MASM语句完成要求:将EBX的内容减1
SUB EBX, 1
指令CDQ将EAX符号扩展到EDX,即:EAX最高为0,则EDX=0;EAX最高为1,则EDX=FFFFFFFFH。请编程实现该指令功能。
〔解答1〕 test eax,8000h ; 测试最高位 jz next1 ; 最高位为0(ZF=1),转移到标号NEXT1 mov edx,0ffffffffh ; 最高位为1,顺序执行:设置EDX=FFFFFFFFH jmp done ; 无条件转移,跳过另一个分支 next1: mov dx,0 ; 最高位为0转移到此执行:设置EDX=0 done: 〔解答2〕 使用移位指令更好。 rol eax,1 rcr edx,1 sar edx,31 ror eax,1 |
用一条MASM语句完成要求:将ECX寄存器内容与双字属性的变量var内容互换。
xchg ecx, var |
编写汇编语言程序片段,判断AL寄存器已经保存的字符是否是大写字母,如果是大写转换为小写字母;如果不是大写字母,则不变。
mov bl, 'a' ; 将ASCII码值'a'存储到BL寄存器 cmp al, 'A' ; 将AL寄存器中的值与ASCII码值'A'进行比较 jb end ; 如果AL寄存器的值小于'A',则跳转到end处 cmp al, 'Z' ; 将AL寄存器中的值与ASCII码值'Z'进行比较 ja end ; 如果AL寄存器的值大于'Z',则跳转到end处 add al, bl ; 如果AL寄存器的值是大写字母,将其转换为小写字母 sub al, 'A' ; 将AL寄存器中存储的大写字母转换为小写字母 add al, 'a' ; 将转换后的小写字母存储到AL寄存器中 end: |
编写8253的初始化程序,使计数器2工作在方式2,计数值为02F0H。已知8253的计数器0~2和控制字I/O地址依次为204H~207H。
mov al,0b4h mov dx,207h out dx,al mov al,02f0h mov dx,206h out dx,al mov al,ah |
用一条MASM语句完成要求:将EAX寄存器内容赋值给eq858双字变量
MOV eq858, EAX |
用一条MASM语句完成要求:将eq858双字变量最低字节部分传送给CL
mov cl, byte ptr eq858 |
在PC机上,并行接口芯片8255A的端口B(I/O地址为62H)被设置为方式0输出,用若干条指令使其中PB4引脚输出低电平,其他引脚的高低电平不变。
mov dx, 62h ; 将8255A芯片端口B的I/O地址62h存储到DX寄存器中 in al, dx ; 从端口B读取当前的数据 and al, 0EFh ; 将PB4引脚设置为低电平,其他引脚保持不变 out dx, al ; 将修改后的数据写回端口B |
用一条MASM语句完成要求:用寄存器EBX和ESI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。
add al, byte ptr [ebx + esi] |
用一条MASM语句完成要求:定义250为字节变量crazy的初值
crazy BYTE 250 |
测试定义为字节单位的变量var的D0位,该位为1使AH=0,为0继续。
test byte ptr var, 1 ; 测试 var 的 D0 位 jnz jump_label ; 如果 D0 位为 1,跳转到 jump_label 标签处 ; 如果 D0 位为 0,继续执行 ; 在这里插入需要执行的代码 jump_label: mov ah, 0 ; 将 AH 寄存器设为 0 |
用一条MASM语句完成要求:获得var变量的偏移地址,传送给ECX
mov ecx, OFFSET var |
用一条MASM语句完成要求:将EAX和EDX内容进行逻辑与,结果保存在EAX
and eax, edx |
用一条MASM语句完成要求:获得eq858双字变量的偏移地址,传送给EBX
mov ebx, offset eq858 |
用一条MASM语句完成要求:调用子程序sum
call sum |
设8253的计数器1工作于方式5,按二进制计数,计数初值为4000H。假设该8253芯片计数器0~3以及控制字I/O地址依次为200H~203H。编写它的初始化程序段
mov al, 10110100B ; 设置控制字:选择计数器 1、工作方式 5、按二进制计数 out 203H, al ; 将控制字写入 I/O 地址为 203H 的端口 mov ax, 4000H ; 设置计数器 1 的初始计数值 out 200H, al ; 将计数器 1 的低位写入 I/O 地址为 200H 的端口 mov al, ah ; 将计数器 1 的高位写入 I/O 地址为 201H 的端口 out 201H, al |
用一条MASM语句完成要求:程序无条件转移到done标号
jmp done; |
编写8253的初始化程序,使计数器0工作在方式1,按BCD码计数,计数值为3000。已知8253的计数器0~2和控制字I/O地址依次为204H~207H。
mov al,33h ;将3000转为BCD码,存入AL mov dx,207h ;将DX设为计数器0的低位初始值的I/O地址 out dx,al mov ax,3000h ; 不是3000 mov dx,204h ;将DX设为计数器0的高位初始值的I/O地址 out dx,al mov al,ah out dx,al |
编写一个程序片段,实现将字符串中大写字母转换为小写字母的功能。已知EBX保存字符串的首地址,ECX保存字符串长度。
mov esi, ebx ; 将字符串首地址保存到esi中 mov ecx, ecx ; 将字符串长度保存到ecx中 convert_loop: cmp ecx, 0 ; 如果字符串已经遍历完了,就跳出循环 je convert_done
mov al, byte ptr[esi] ; 将字符串中当前位置的字符读入al中 cmp al, 'A' ; 如果当前字符是大写字母 jb convert_next ; 如果不是大写字母,直接跳到下一个字符 cmp al, 'Z' ja convert_next add al, 32 ; 大写字母的ASCII码比小写字母大32 mov byte ptr[esi], al ; 将转换后的字符写回字符串中 convert_next: inc esi ; 指向下一个字符 dec ecx ; 将剩余字符串的长度减1 jmp convert_loop ; 继续循环 convert_done: |
用一条MASM语句完成要求:把数0A0H与EAX寄存器的内容相加,并把结果送回EAX中。
add eax,0a0h |
用一条MASM语句完成要求:将寄存器EAX最高位改变为0,其他位保持不变
and eax, 7FFFFFFFh ; 将EAX与7FFFFFFFh进行按位与运算,最高位变为0 |
编写8253的初始化程序,使计数器1工作在方式0,仅用8位二进制计数,计数初值为128。已知8253的计数器0~2和控制字I/O地址依次为204H~207H。
mov al,50h mov dx,207h out dx,al mov al,128 ; 计数初值为128,二进制表示为0b1000 0000 mov dx,205h out dx,al |
用一条MASM语句完成要求:将寄存器EDX内容减去4578,差值存入EDX。
sub edx, 4578 |
编写8253计数器2的初始化程序,使计数器2工作在方式1,仅用8位二进制计数,计数初值为210。已知8253的计数器0~2和控制字I/O地址依次为300H~303H。
MOV AL, 00110110b ; 控制字:选择计数器2,操作模式为方式1,只使用8位二进制计数值 OUT 031CH, AL ; 将控制字写入端口地址0x31C(即303H) MOV AL, 0D2H ; 计数初值低字节 OUT 0300H, AL ; 将低字节写入端口地址0x300(即300H) MOV AL, 00000010b ; 操作命令字寄存器:选择计数器2,写入计数初值的高字节 OUT 031CH, AL ; 将操作命令字写入端口地址0x31C(即303H) MOV AL, 0 ; 计数初值高字节 OUT 0300H, AL ; 将高字节写入端口地址0x300(即300H) |
用一条MASM语句完成要求:将var双字变量最低字节部分传送给CL
MOV CL, var |
用一条MASM语句完成要求:获得变量var的偏移地址,并保存在EBX寄存器。
MOV EBX, OFFSET var |
用一条MASM语句完成要求:定义一个字符串,名为string,内容是“hello.”
string DB 'hello.', 0 ;DB指令是用于定义数据的伪指令,它告诉汇编器将字符串“hello.”存储在内存中,并以0作为字符串的结束标志。 |
设8253计数器0工作于方式0,只需用8位二进制计数,其计数值为50。假设该8253芯片计数器0~3以及控制字I/O地址依次为90H~93H。编写它的初始化程序段。
; 8253计数器0初始化程序段 MOV AL, 00000000B ; 设置计数器0的工作方式0,只需用8位二进制计数 OUT 091H, AL ; 将控制字输出到I/O地址91H MOV AL, 50 ; 设置计数器0的计数值为50 OUT 090H, AL ; 将计数值输出到I/O地址90H RET ; 返回主程序 |
如下在数据段为变量char预留了26个字母的存储空间。在代码段,编写程序片段,将大写字母A~Z依次存放进去。 .data char byte 26 dup(?) .code
.data char byte 26 dup(?) .code MOV AL, 'A' ; 将字母'A'存储到AL寄存器中 MOV ECX, 26 ; 循环计数器,循环26次 MOV EDI, OFFSET char ; 将char变量的偏移地址存储到EDI寄存器中 store_loop: MOV [EDI], AL ; 将AL寄存器中的值存储到char变量中 INC AL ; 将AL寄存器中的值加1,即存储下一个字母 INC EDI ; 将EDI寄存器中的值增加1,指向下一个char变量 LOOP store_loop ; 循环直到ECX计数器为0 |
使用移位、加减等指令实现将EBX内的无符号整数扩大17倍。注意,不允许使用乘法指令,要求有指令功能的简单注释
MOV EAX, EBX ; 将EBX的值存储到EAX中 SHL EAX, 4 ; 将EAX左移4位,相当于乘以16 ADD EAX, EBX ; 将EAX加上原来的EBX,相当于乘以17 MOV EBX, EAX ; 将结果存储回EBX中 |
编写一个程序片段,统计一个双字数据中所包含逻辑“1”的个数,假设这个数据保存在变量dwvar中。
MOV EAX, dwvar ; 将dwvar的值存储到EAX中 ; 初始化循环计数器和1的个数计数器 MOV ECX, 32 ; 循环计数器,循环32次(一个双字有32位) XOR EDX, EDX ; 1的个数计数器,初始化为0 count_loop: TEST EAX, 1 ; 检查EAX的最低位是否为1 JZ skip ; 如果最低位为0,则跳过计数 INC EDX ; 如果最低位为1,则递增1的个数计数器 skip: SHR EAX, 1 ; 将EAX右移1位,相当于将二进制数向右移动一位 LOOP count_loop ; 循环直到ECX计数器为0 |
编制一个程序片断,将数组ARRAY所有元素求和,结果保存在变量SUM。假设数组元素为32位整数,个数用常量COUNT表示,且求和过程不会出现溢出或进位。
MOV EAX, 0 ; 将0存储到EAX中,作为累加器的初始值 MOV ECX, COUNT ; 循环计数器,循环COUNT次 MOV EDI, OFFSET ARRAY ; 将ARRAY变量的偏移地址存储到EDI中 sum_loop: ADD EAX, [EDI] ; 将EAX加上当前数组元素的值 ADD EDI, 4 ; 增加EDI的值,指向下一个数组元素 LOOP sum_loop ; 循环直到ECX计数器为0 MOV SUM, EAX ; 将结果存储到SUM中 |
设8253计数器1工作于方式1,按二进制计数,计数初值为400。假设该8253芯片计数器0~3以及控制字I/O地址依次为60H~63H。编写它的初始化程序段。
MOV AL, 00110110b ; 控制字:选择计数器1,操作模式为方式1,只使用16位二进制计数值 OUT 061H, AL ; 将控制字写入端口地址0x61(即61H) MOV AX, 0400H ; 计数初值为400 OUT 060H, AL ; 将低字节写入端口地址0x60(即60H) MOV AL, AH ; 将高字节写入端口地址0x61(即61H) OUT 060H, AL |
用一条MASM语句完成要求:将eq858双字变量值减少100
sub eq858, 100d |
用一条MASM语句完成要求:将数据3721传送给EBX寄存器
MOV EBX, 3721 ;
用一条MASM语句完成要求:程序无条件转移到again标号
JMP again
用一条MASM语句完成要求:求反EAX
NEG EAX
编写一个程序片段,判断AL寄存器是不是数码“0”到“9”之间的ASCII码字符。如果是,则将BL设置为1;否则设置BL为0。
CMP AL, '0' ; 比较AL寄存器中的值是否大于等于字符'0' JB not_digit ; 如果小于'0',则不是数字,跳转到not_digit CMP AL, '9' ; 比较AL寄存器中的值是否小于等于字符'9' JA not_digit ; 如果大于'9',则不是数字,跳转到not_digit MOV BL, 1 ; 如果执行到这里,说明是数字,将BL设置为1 JMP done ; 跳过not_digit标号 not_digit: MOV BL, 0 ; 如果执行到这里,说明不是数字,将BL设置为0 done: |
用一条MASM语句完成要求:将32位变量VARD与数3412H相加,并把结果送回该存储单元中。
ADD DWORD PTR VARD, 3412H ; 使用DWORD PTR关键字来指示操作数是一个32位双字。
用一条MASM语句完成要求:定义双字变量var,初值有两个,依次是:110,120
var DD 110, 120
用一条MASM语句完成要求:用EBX和位移量0B2H的寄存器相对寻址方式把存储器中的一个双字和ECX寄存器的内容相加,并把结果送回存储器中。
add [EBX+0B2H], ECX
用一条MASM语句完成要求:将var双字变量值增加99
add var, 99
用一条MASM语句完成要求:将eq858双字变量值压入堆栈
push eq858
数据段保存有如下字符串: string byte 'Do not give up!',0 ;以0结尾的字符串 请在代码段,编写统计字符串中字符个数的程序片断(不包括结尾标志0)。
; 假设数据段的字符串标签为 str mov esi, str ; 把字符串地址放入 esi 寄存器 mov ecx, 0 ; 初始化字符个数为 0 count_loop: mov al, byte [esi] ; 把 esi 所指向的字节加载到 al 寄存器中 cmp al, 0 ; 检查 al 是否为 0 je count_done ; 如果是 0,则结束统计循环 inc ecx ; 否则字符个数加 1 inc esi ; 令 esi 指向下一个字节 jmp count_loop ; 继续循环 count_done: |
用一条MASM语句完成要求:将寄存器EDX内容加上4578,和值存入EDX
add edx, 4578
用一条MASM语句完成要求:把EBX寄存器和EDX寄存器的内容相加,结果存入EDX寄存器。
add edx, ebx
用一条MASM语句完成要求:设置ESI为字符串string的偏移地址
lea esi, OFFSET string; 使用OFFSET运算符获取字符串string的偏移地址,并将其存储在ESI寄存器中。
编写一个程序片段,在EDX低4位全为0时,使EAX=1;否则使EAX=-1。
mov edx, 0xFFFFFFFF ; 使用全1的值来测试 and edx, 0xFFFFFFF0 ; 将EDX低4位清零 jz set_eax_to_1 ; 如果EDX低4位全为0,跳转到set_eax_to_1标签 mov eax, -1 ; EDX低4位不全为0,将EAX设为-1 jmp exit ; 跳过set_eax_to_1标签,跳转到exit标签 set_eax_to_1: mov eax, 1 ; 将EAX设为1 exit: ; 程序片段结束 |
编制一段程序,把变量var1和var2中较大者存入var3;若两者相等,则把其中之一存入var3中。假设变量存放的是32位无符号数
MOV EAX, var1 ; 把var1的值存储到EAX寄存器中 CMP var2, EAX ; 比较var2和EAX寄存器中的值 JA set_var3 ; 如果var2大于EAX,则跳转到set_var3标号 MOV EAX, var2 ; 如果执行到这里,说明var2不大于EAX,把var2的值存储到EAX寄存器中 set_var3: MOV var3, EAX ; 将EAX寄存器中的值存储到var3中 done: ; 继续执行其他指令... |
用一条MASM语句完成要求:定义一个字符串,名为string,内容是“Try it.”
string db 'Try it.', 0 ;
用一条MASM语句完成要求:获得变量var的偏移地址,并保存在EDX寄存器
lea edx, var
用一条MASM语句完成要求:将CX内容传送给var双字变量高字部分
MOV WORD PTR var + 2, CX ;
用一条MASM语句完成要求:将DH内容传送给var双字变量最高字节部分
mov byte ptr [edx+3], dh
用一条MASM语句完成要求:将EAX和EDX内容进行求和,结果保存在EAX
add eax, edx
问答题:
利用ADD指令的源操作数,各举一个指令实例说明什么是立即数寻址、寄存器寻址和存储器直接寻址。
1)立即数寻址 在立即数寻址模式下,ADD指令的源操作数是一个立即数(也称为立即数数据),它是硬编码在指令中的。例如,以下代码将立即数5加到寄存器EAX中: ADD EAX, 5 这段代码使用了立即数寻址模式,其中的5就是一个立即数。当执行该指令时,CPU会将EAX寄存器中的值与立即数5相加,并将结果存储回EAX寄存器中。 2)寄存器寻址 在寄存器寻址模式下,ADD指令的源操作数是一个寄存器。例如,以下代码将寄存器EBX的值加到寄存器EAX中: ADD EAX, EBX 这段代码使用了寄存器寻址模式,其中的EBX就是一个寄存器。当执行该指令时,CPU会将EAX寄存器中的值与EBX寄存器中的值相加,并将结果存储回EAX寄存器中。 3)存储器直接寻址 在存储器直接寻址模式下,ADD指令的源操作数是一个内存地址。例如,以下代码将变量var的值加到寄存器EAX中: ADD EAX, DWORD PTR var 这段代码使用了存储器直接寻址模式,其中的DWORD PTR var就是一个内存地址。当执行该指令时,CPU会访问内存中var的地址,并将该地址中存储的值与EAX寄存器中的值相加,并将结果存储回EAX寄存器中。需要注意的是,在存储器直接寻址模式下,我们需要使用PTR关键字指定操作数的数据类型。 |
IA-32处理器有一个CF标志,它是如何定义的?并给出3条影响该标志的指令。
CF标志是IA-32处理器中的一个条件码标志位(也称为状态标志位),它记录了算术运算或逻辑运算的进位或借位情况。具体来说,当执行一个带有进位或借位的算术或逻辑指令时,CF标志会被设置为1或0,表示是否产生了进位或借位。 以下是三条影响CF标志的指令:
ADC指令用于进行带进位的加法。例如,以下代码将寄存器EAX和寄存器EBX中的值相加,并将CF标志设置为1或0,表示是否产生了进位: 复制代码 ADC EAX, EBX 如果CF标志原先为1,则执行这条指令后,CF标志将被设置为1或0,表示产生或未产生进位。如果CF标志原先为0,则执行这条指令后,CF标志将被设置为0或1,表示未产生或产生进位。
SBB指令用于进行带借位的减法。例如,以下代码将寄存器EAX的值减去寄存器EBX的值,并将CF标志设置为1或0,表示是否产生了借位: 复制代码 SBB EAX, EBX 如果CF标志原先为1,则执行这条指令后,CF标志将被设置为1或0,表示产生或未产生借位。如果CF标志原先为0,则执行这条指令后,CF标志将被设置为1或0,表示产生或未产生借位。
SHL和SHR指令用于进行逻辑左移和逻辑右移操作。例如,以下代码将寄存器EAX中的值左移2位,并将CF标志设置为最后一位的值: 复制代码 SHL EAX, 2 执行这条指令后,EAX寄存器中的值会左移2位,并在低2位填充0。同时,CF标志将被设置为进位位的值(也就是原先EAX寄存器中的第31位是否为1)。 类似地,以下代码将寄存器EBX中的值右移4位,并将CF标志设置为最后一位的值: 复制代码 SHR EBX, 4 执行这条指令后,EBX寄存器中的值会右移4位,并在高4位填充0。同时,CF标志将被设置为最后一位的值(也就是原先EBX寄存器中的第0位是否为1)。 |
什么是汇编语言?汇编语言程序和汇编程序有什么区别?
汇编语言:用助记符表示的指令以及使用它们编写程序的规则就形成汇编语言。
汇编语言程序:用汇编语言书写的程序就是汇编语言程序,或称汇编语言源程序。
汇编程序:汇编语言源程序要翻译成机器语言程序才可以由处理器执行。这个翻译的过程称为“汇编”,完成汇编工作的程序就是汇编程序(Assembler)。
说明标志ZF的含义,何时为0,何时为1?
ZF标志是IA-32处理器中的一个条件码标志位(也称为状态标志位),它记录了算术运算或逻辑运算的结果是否为0。具体来说,当执行一个带有比较、测试或其他逻辑指令时,ZF标志会被设置为1或0,表示运算结果是否为0。
当运算结果为0时,ZF标志被设置为1;否则,ZF标志被设置为0。
在MASM中,字符“'F'”和数值46H作为MOV指令的源操作数有区别吗?为什么?
在MOV指令中,字符“'F'”和数值46H作为源操作数是等价的,因为它们都代表ASCII码值46,即字母“F”的ASCII码值。在汇编语言中,字符的ASCII码值可以直接对应到一个对应的十六进制数,因此它们在MOV指令中没有区别。
为什么称处理器的数据总线是双向的?
数据总线承担着处理器与存储器、外设之间的数据交换既可以输入也可以输出故其是双向的。
数码0~9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码0DH和0AH分别对应什么控制字符?
数字0~9的ASCII码分别为48~57,
大写字母A~Z的ASCII码分别为65~90,
小写字母a~z的ASCII码分别为97~122。
ASCII码0DH是回车符,表示将光标移到行首;
0AH是换行符,表示将光标移到下一行开头。
简述DMA传送的一般工作过程。
1)DMA预处理:
在DMA传送之前必须要做准备工作,即初始化。 CPU首先执行几条I /O 指令,用于测试外设的状态、向DMA控制器的有关寄存器设置初值、设置传送方向、启动该外部设备等。在这些工作完成之后, CPU继续执行原来的程序,由外设向DMA控制 器发DMA请求,再由DMA控制器向CPU发总线请求。
2)数据传送:
DMA的数据传送可以单字节(或字)为基本单位,也可以数据块为基本单位。
3)DMA后处理:
当传送长度计数器计到0 时,DMA操作结束,DMA控制器向CP发中断请求,CPU停止原来程序的执行,转去执行中断服务程序做 DMA结束处理工作。
处理器执行指令“xor eax,eax”后,标志CF、ZF、SF、OF和PF的状态依次是什么?
xor ax,ax ;AX=0 、CF=0 、ZF=1 、SF=0 、OF=0 、PF =1
EISA总线的时钟频率是8MHz,每2个时钟可以传送一个16位数据,计算其总线带宽。
(16×8)÷(2×8)=8MBps
EISA总线的时钟频率是8MHz,每2个时钟可以传送一个32位数据,计算其总线带宽。
(32×8)÷(2×8)=16MBps
使用二进制8位表达无符号整数,257有对应的编码吗?数值500,能够作为字节变量的初值吗?为什么?
没有。使用二进制8位表达无符号整数的范围为0~255,因此257没有对应的编码。
不能。一个byte只有8位,数值范围从0到255,数值500大于一个字节所能表达的数据量,所以不能作为字节变量的初值。
给出4种主机与外设进行数据传送方式的名称。
① 无条件传送方式,常用于简单设备,处理器认为它们总是处于就绪状态,随时进行数据传送。
② 程序查询方式:处理器首先查询外设工作状态,在外设就绪时进行数据传送。
③ 中断方式:外设在准备就绪的条件下通过请求引脚信号,主动向处理器提出交换数据的请求。处理器无其他更紧迫任务,则执行中断服务程序完成一次数据传送。
④ DMA传送: DMA控制器可接管总线,作为总线的主控设备,通过系统总线来控制存储器和外设直接进行数据交换。此种方式适用于需要大量数据高速传送的场合。
汇编语句有哪两种,每个语句由哪4个部分组成?
汇编语句有两种:执行性语句(处理器指令)、说明性语句(伪指令)。
每个语句有:标号、指令助记符、操作数或参数、注释4个部分组成。
简述高性能存储系统的层次结构及各层存储部件的特点。
为解决容量、速度和价格的矛盾,存储系统采用金字塔型层次结构,单位价格和速度自上而下逐层减少,容量自上而下逐层增加。
存储系统的各层存储部件自上而下依次是:CPU寄存器、高速缓存、主存存储器(RAM/ROM),辅助存储器如磁盘、光盘等。CPU寄存器、高速缓存器集成在CPU芯片上,对用户来说,是透明的,它们用于暂存主存和处理器交互的数据,以减少频繁读取主存而影响处理器速度;主存储器则可和处理器直接交换数据,而辅助存储器必须经过主存存储器,才可与处理器进行数据交换。
什么是主机与外设进行数据交换的DMA传送?
DMA控制器可接管总线,作为总线的主控设备,通过系统总线来控制存储器和外设直接进行数据交换。此种方式适用于需要大量数据高速传送的场合。
子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题?
子程序保持堆栈平衡,才能保证执行RET指令时当前栈顶的内容是正确的返回地址。主程序也要保持堆栈平衡,这样才能释放传递参数占用的堆栈空间,否则多次调用该子程序可能就致使堆栈溢出。
什么是微机的系统总线?一般将总线信号进一步分为哪3组总线?
系统总线:通常是指微机系统的主要总线。
总线信号分成三组,分别是数据总线、地址总线和控制总线。
什么是IA-32处理器的除法错中断?什么情况下会出现该中断?请给出一个实例。
IA-32处理器的中断类型号(也称向量号)类型0为“除法错”。 是除法除以 0。
标志寄存器主要保存哪方面的信息?执行了一条加法指令后,发现ZF=1,说明结果是什么?
标志寄存器主要保存反映指令执行结果和控制指令执行形式的有关状态。
ZF为零标志,ZF=1,表示运算结果为0。
I/O地址(端口)的I/O独立编址有什么特点?
独立编址是将I/O端口单独编排地址,独立于存储器地址。
端口独立编址方式,处理器除要具有存储器访问的指令和引脚外,还需要设计I/O访问的I/O指令和I/O引脚,其优点是:不占用存储器空间;I/O指令使程序中I/O操作一目了然;较小的I/O地址空间使地址译码简单。但I/O指令功能简单,寻址方式没有存储器指令丰富。
什么是JMP指令的近(near)转移和远(far)转移?
jmp指令的近转移是指在同一个段里面的转移,也叫做段内近转移,用汇编编码就是这样的jmp near ptr 标号
jmp指令的远转移是指段与段之间的转移,就是说不在同一个段的转移,用汇编编码就是这样的jmp far ptr 标号
什么是奇偶校验中的奇校验和偶校验?
数据通信时,数据的某一位用做传输数据的奇偶校验位,数据中包括校验位在内的“1”的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验。
什么是指令周期、总线周期和时钟周期?
指令周期:一条指令从取指、译码到最终执行完成的过程。
总线周期(机器周期):有数据交换的总线操作。
时钟周期:处理器的基本工作节拍,由时钟信号产生,一个高电平和一个低电平为一个周期。
IA-32处理器有哪三类基本段,各是什么用途?
IA-32处理器有代码段、数据段、堆栈段三类基本段。
代码段:存放程序的指令代码。程序的指令代码必须安排在代码段,否则将无法正常执行。
数据段:存放当前运行程序所用的数据。程序中的数据默认是存放在数据段,也可以存放在其他逻辑段中。
堆栈段:主存中堆栈所在的区域。程序使用的堆栈一定在堆栈段。
什么是DMA传送,什么是DMA传送的DMA读和DMA写?
DMA传送:是主机与外设进行数据交换方式,DMA控制器可接管总线,作为总线的主控设备,通过系统总线来控制存储器和外设直接进行数据交换。此种方式适用于需要大量数据高速传送的场合。
DMA读:存储器的数据在DMA控制器控制下被读出传送给外设。
DMA写:外设的数据在DMA控制器控制下被写入存储器。
都是获取偏移地址,为什么指令“LEA EBX, [ESI]”正确,而指令“MOV EBX, OFFSET[ESI]”就错误?
前者在指令执行时获得偏移地址,是正确的;但后者的 OFFSET只能在汇编阶段获得偏移地址,但此时寄存器内容是不可知的,所以无法获得偏移地址。
说明微型计算机系统的硬件组成及各部分作用。
CPU:CPU也称处理器,是微机的核心。它采用大规模集成电路芯片,芯片内集成了控制器、运算器和若干高速存储单元(即寄存器)。处理器及其支持电路构成了微机系统的控制中心,对系统的各个部件进行统一的协调和控制。
存储器:存储器是存放程序和数据的部件。
外部设备:外部设备是指可与微机进行交互的输入(Input)设备和输出(Output)设备,也称I/O设备。I/O设备通过I/O接口与主机连接。
总线:互连各个部件的共用通道,主要含数据总线、地址总线和控制总线信号。
什么是存储访问的局部性原理,它分成哪两个方面的局部性?
处理器访问存储器时,无论是读取指令还是存取数据,所访问的存储单元在一段时间内都趋向于一个较小的连续区域中,这就是存储访问的局部性原理。
空间局部、时间局部。
“取指”是处理器进行的什么操作?为什么8086的“取指”可以被称为“预取”?
“取指”是指处理器从主存取出指令代码通过总线传输到处理器内部指令寄存器的过程。8086分成总线接口单元(BIU)和指令执行单元(EU),可以独立操作。在执行单元执行一条指令进行译码执行时,总线接口单元可以读取下一条指令,等到执行时不需要进行取指了,所以称为预取。换句话说BIU与EU两个单元相互独立,分别完成各自操作。
说明高级语言和汇编语言(机器语言)的区别。
高级语言与具体的计算机硬件无关,其表达方式接近于所描述的问题,易为人们接受和掌握,用高级语言编写程序要比低级语言容易得多,并大大简化了程序的编制和调试,使编程效率得到大幅度的提高。
而汇编语言是为了便于理解与记忆,将机器指令用助记符代替而形成的一种语言。汇编语言的语句通常与机器指令对应,因此,汇编语言与具体的计算机有关,属于低级语言。它比机器语言直观,容易理解和记忆,用汇编语言编写的程序也比机器语言易阅读、易排错。
机器语言的每一条机器指令都是二进制形式的指令代码,计算机硬件可以直接识别。高级语言程序通常也需要翻译成汇编语言程序,再进一步翻译成机器语言代码。
什么是I/O地址(端口)的I/O独立编址和统一编址?
独立编址是将I/O端口单独编排地址,独立于存储器地址。
统一编址是将I/O端口与存储器地址统一编排,共享一个地址空间。
执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1? mov eax,20h cmp eax,80h
CF=1 ZF=0 SF=1 OF=0 PF=1
为什么可以把指令“MOV AX, (34+67H)*3”中的数值表达式看成是常量?
汇编程序在汇编过程中对数值表达式计算,得到一个确定的数值,故称数值表达式为常量。
执行如下程序片断后,CMP指令会使得哪些条件转移指令指令Jcc的条件成立、发生转移? mov eax,20h cmp eax,80h
可以使得条件成立、发生转移的指令有:JC JS JP JNZ JNO
冯·诺依曼计算机的基本设计思想是什么?
采用二进制形式表示数据和指令。指令由操作码和地址码组成。
将程序和数据存放在存储器中,计算机在工作时从存储器取出指令加以执行,自动完成计算任务。这就是“存储程序”和“程序控制”(简称存储程序控制)的概念。
指令的执行是顺序的,即一般按照指令在存储器中存放的顺序执行,程序分支由转移指令实现。
计算机由存储器、运算器、控制器、输入设备和输出设备五大基本部件组成,并规定了5部分的基本功能。
8086处理器的输入控制信号有RESET,HOLD,NMI和INTR,其含义各是什么?
RESET:复位输入信号,高电平有效。该引脚有效时,将迫使处理器回到其初始状态;转为无效时,CPU重新开始工作。
HOLD:总线请求,是一个高电平有效的输入信号。该引脚有效时,表示其他总线主控设备向处理器申请使用原来由处理器控制的总线。
NMI:不可屏蔽中断请求,是一个利用上升沿有效的输入信号。该引脚信号有效时,表示外界向CPU申请不可屏蔽中断。
INTR:可屏蔽中断请求,是一个高电平有效的输入信号。该引脚信号有效时,表示中断请求设备向处理器申请可屏蔽中断。
在半导体存储器件中,什么是RAM?SRAM和DRAM有什么区别?
RAM是随机存取存储器;
SRAM是静态读写存储器芯片,它以触发器为基本存储单元,以其两种稳定状态表示逻辑0和逻辑1。
DRAM是动态读写存储器芯片,它以单个MOS管为基本存储单元,以极间电容充放电表示两种逻辑状态,需要不断刷新保持信息正确。
8086处理器在最下组态有哪些基本的读写控制引脚信号,各是什么含义?
HLDA:为输出控制信号,是CPU发给外部的控制信号和响应信号;
RESET:复位输入信号,高电平有效。该引脚有效时,将迫使处理器回到其初始状态;转为无效时,CPU重新开始工作。
HOLD:总线请求,是一个高电平有效的输入信号。该引脚有效时,表示其他总线主控设备向处理器申请使用原来由处理器控制的总线。
NMI:不可屏蔽中断请求,是一个利用上升沿有效的输入信号。该引脚信号有效时,表示外界向CPU申请不可屏蔽中断。
INTR:可屏蔽中断请求,是一个高电平有效的输入信号。该引脚信号有效时,表示中断请求设备向处理器申请可屏蔽中断。。
处理器通过总线与存储器或外设进行数据交换,所以总线设计有4种最基本的总线操作(周期),请问是哪4种,表示怎样进行交换?
① 无条件传送方式,常用于简单设备,处理器认为它们总是处于就绪状态,随时进行数据传送。
② 程序查询方式:处理器首先查询外设工作状态,在外设就绪时进行数据传送。
③ 中断方式:外设在准备就绪的条件下通过请求引脚信号,主动向处理器提出交换数据的请求。处理器无其他更紧迫任务,则执行中断服务程序完成一次数据传送。
④ DMA传送: DMA控制器可接管总线,作为总线的主控设备,通过系统总线来控制存储器和外设直接进行数据交换。此种方式适用于需要大量数据高速传送的场合。
处理器完成一条指令的整个处理过程,可以分为取指、译码和执行3个阶段,说明这3个阶段的主要功能。
处理器的“取指—译码—执行周期” 是指处理器从主存储器读取指令(简称取指),翻译指令代码的功能(简称译码),然后执行指令所规定的操作(简称执行)的过程。
使用MASM汇编程序,在数据段有一个语句“byte 37h,21,’no’”,它将使处理器为其分配多少个字节的主存空间?从低地址开始每个地址单元的内容依次是什么?
37h分配一个字节
21分配一个字节
no分配2个字节
所以共需分配4个字节,
内容依次是: 37h, 21,‘n’,‘o’
存储器的存取时间和存取周期有什么区别?
存取时间是指从读/写命令发出,到数据传输操作完成所经历的时间;存取周期表示两次存储器访问所允许的最小时间间隔。存取周期大于等于存取时间。
8253芯片需要几个I/O地址,各用于何种目的?
4个,读写计数器0,1和2,及控制字。
什么是8086中的逻辑地址和物理地址?
物理地址:在处理器地址总线上输出的地址称为物理地址。每个存储单元有一个唯一的物理地址。
逻辑地址:在处理器内部、程序员编程时采用逻辑地址,采用“段地址:偏移地址“形式。某个存储单元可以有多个逻辑地址,即处于不同起点的逻辑段中,但其物理地址是唯一的。
为什么说“XCHG EDX,CX”是一条错误的指令?
源、目标寄存器位数不同,不能用该指令进行数据交换。
写出IA-32处理器8个32位通用寄存器的名称、8086处理器支持的8个16位通用寄存器名称、以及其中4个寄存器又可分成的8个8位通用寄存器的名称。
IA-32系列CPU有8个32位通用寄存器:EAX、 EBX、 ECX、 EDX、 ESI、 EDI、 EBP、 ESP
在 8086 CPU 中,通用寄存器有 8 个,分别是 AX,BX,CX,DX,SP,BP,SI,DI ,
AX 寄存器可以分为两个独立的 8 位的 AH 和 AL 寄存器;
BX 寄存器可以分为两个独立的 8 位的 BH 和 BL 寄存器;
CX 寄存器可以分为两个独立的 8 位的 CH 和 CL 寄存器;
DX 寄存器可以分为两个独立的 8 位的 DH 和 DL 寄存器;
什么是EPROM和EEPROM?
EPROM:一般指可用紫外光擦除、并可重复编程的ROM。
EEPROM:也常表达为E2PROM,其擦除和编程(即擦写)通过加电的方法来进行,可实现“在线编程”和“在应用编程”
乘除法运算针对无符号数和有符号数,有两种不同的指令。只有一种指令的加减法如何区别无符号数和有符号数运算?
加减法不区别无符号数和有符号数,但根据运算结果分别设置标志寄存器的 CF 和 OF 标志,可 利用 CF 和 OF 进行区别。
为什么判断无符号数大小和有符号大小的条件转移指令不同?
无符号数和有符号数的操作影响两组不同的标志状态位,故判断两个无符号数和有符号数的大小关系要利用不同的标志位组合,所以有对应的两组指令。
一般的I/O接口电路安排有哪3类寄存器?它们各自的作用是什么?
① 数据寄存器
保存处理器与外设之间交换的数据。
② 状态寄存器
保存外设当前的工作状态信息。处理器通过该寄存器掌握外设状态,进行数据交换。
③ 控制寄存器
保存处理器控制接口电路和外设操作的有关信息。处理器向控制寄存器写入控制信息,选择接口电路的不同工作方式和与外设交换数据形式。
8253芯片每个计数通道与外设接口有哪些信号线,每个信号的用途是什么?
CLK时钟输入信号:在计数过程中,此引脚上每输入一个时钟信号(下降沿),计数器的计数值减1。
GATE门控输入信号:控制计数器工作,可分成电平控制和上升沿控制两种类型。
OUT计数器输出信号:当一次计数过程结束(计数值减为0),OUT引脚上将产生一个输出信号。
什么是主机与外设进行数据交换的中断方式?
外设在准备就绪的条件下通过请求引脚信号,主动向处理器提出交换数据的请求。处理器无其他更紧迫任务,则执行中断服务程序完成一次数据传送。
半导体随机读写存储器有两类SRAM和DRAM,比较它们的主要特点。
SRAM是静态读写存储器芯片,它以触发器为基本存储单元,以其两种稳定状态表示逻辑0和逻辑1。
DRAM是动态读写存储器芯片,它以单个MOS管为基本存储单元,以极间电容充放电表示两种逻辑状态,需要不断刷新保持信息正确。
给出汇编语言执行性语句和说明性语句的一般格式。
执行性语句格式:标号: 处理器指令助记符 操作数,操作数 ;注释
说明性语句格式(指示性):名字 伪指令助记符 参数,参数~~ ;注释
简述中断传送的一般工作过程。
在中断传送方式中,通常在一个主程序中安排好在某一时刻启动某一外设后,CPU继续执行主程序。此时,外没准备数据传送的工作。当外设完成数据传送的准备时,通过中断控制逻辑向CPU发出中断请求,在CPU可以响应中断的条件下(CPU已开中断―IF=1,并且在完成当前指令后),现行主程序被“中断”,通过中断控制逻辑提供的“中断类型码”,从“中断向量表”中读入“中断向量”转去执行“中断服务程序”,在“中断服务程序”中完成一次CPU与外设之间的数据传送。传送完成后返回被中断的主程序,从断点处继续执行,并等待外设的下一次中断请求。
什么是主机与外设进行数据交换的程序查询方式?
处理器首先查询外设工作状态,在外设就绪时进行数据传送,若外设未准备就绪,主机将再次查询。
解释中断概念:中断识别、中断优先权、中断嵌套。
中断识别:处理器识别出当前究竟是哪个中断源提出了请求,并明确与之相应的中断服务程序所在主存位置。
中断优先权:为每个中断源分配一级中断优先权,即系统设计者事先为每个中断源确定处理器响应他们的先后顺序。
中断嵌套:在一个中断处理过程中又有一个中断请求被响应处理,称为中断嵌套。
汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。
编辑:用文本编辑器形成一个以ASM为扩展名的源程序文件。
汇编:用汇编程序将ASM文件转换为OBJ模块文件。
连接:用连接程序将一个或多个目标文件链接成一个EXE或COM可执行文件。
调试:用调试程序排除错误,生成正确的可执行文件。
使用MASM汇编程序,在数据段有一个语句“xyz byte 56h,23,’ab’”,它将使变量xyz占用多少个字节的主存空间?从低地址开始每个地址单元的内容依次是什么?
占用4个字节主存空间 内容依次是: 56h,23,‘a’,‘b’
主机与外设进行数据交换有哪几种常用方式。
主机与外设进行数据交换的几种常用方式:
① 无条件传送方式,常用于简单设备,处理器认为它们总是处于就绪状态,随时进行数据传送。
② 程序查询方式:处理器首先查询外设工作状态,在外设就绪时进行数据传送。
③ 中断方式:外设在准备就绪的条件下通过请求引脚信号,主动向处理器提出交换数据的请求。处理器无其他更紧迫任务,则执行中断服务程序完成一次数据传送。
④ DMA传送: DMA控制器可接管总线,作为总线的主控设备,通过系统总线来控制存储器和外设直接进行数据交换。此种方式适用于需要大量数据高速传送的场合。
是什么特点决定了目标地址的相对寻址方式应用最多?
当同一个程序被操作系统安排到不同的存储区域执行时,指令间的位移没有改变,目标地址采用相对寻址可方便操作系统的灵活调度。
举例说明什么是Intel 80x86处理器数据存储的小端方式(Little Endian)?
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
如:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前 32 位应该这样读: 4e 6c 84 e6( 假设 int 占 4 个字节)
处理器的基本指令类型有数据传送、算术运算、逻辑运算、移位、流程控制等,以IA-32指令系统为例,对上述5种类型的指令各给出两个指令实例。
数据传送指令: MOV AX, BX ;将BX寄存器的值传送到AX寄存器中 MOV DL, BYTE PTR [SI+10] ;将内存地址SI+10处的1Byte数据传送到DL寄存器中 算术运算指令: ADD AX, BX ;将BX寄存器的值与AX寄存器的值相加并将结果保存在AX中 SUB BX, 100 ;将BX寄存器的值减去100并将结果保存在BX中 逻辑运算指令: AND AX, BX ;将BX寄存器的值与AX寄存器的值进行逻辑与运算并将结果保存在AX中 OR AX, BX ;将BX寄存器的值与AX寄存器的值进行逻辑或运算并将结果保存在AX中 移位指令: SAL AX, 2 ;将AX寄存器的值左移2位 SHR BX, 3 ;将BX寄存器的值右移3位 流程控制指令: JMP label_name ;无条件跳转到指定标签处继续执行 JZ label_name ;当标志位ZF为1时跳转到指定标签处继续执行 |
INC,DEC,NEG和NOT都是单操作数指令,这个操作数应该是源操作数还是目的操作数?
即是目的操作数也是源操作数。
什么是存储器芯片的全译码和部分译码?各有什么特点?
全译码:使用全部系统地址总线进行译码。特点是地址唯一,一个存储单元只对应一个存储器地址(反之亦然),组成的存储系统其地址空间连续。
部分译码:只使用部分系统地址总线进行译码。其特点:有一个没有被使用的地址信号就有两种编码,这两个编码指向同一个存储单元,出现地址重复。
什么是标志?什么是IA-32处理器的状态标志、控制标志和系统标志?
标志(Flag):用于反映指令执行结果或控制指令执行形式的一个或多个二进制数位。例如,有些指令执行后会影响有关标志位;有些指令的执行要利用相关标志。
状态标志:用来记录程序运行结果的状态信息。
控制标志:DF标志,控制字符串操作的地址方向。DF=0每次串操作后的存储器地址就会自动增加,即从低地址向高地址处理数据串。DF=1,每次串操作后的存储器地址就会自动减少,即从高地址向低地址处理数据串。处理器执行CLD指令设置DF=0,执行STD指令设置DF=1。
系统标志:用于控制处理器执行指令的方式。
存储系统为什么不能采用一种存储器件构成?
因为各种存储器件在容量、速度和价格方面存在矛盾。速度快,则单位价格高;容量大,单位价格低,但存取速度慢。故存储系统不能采用一种存储器件。
处理器有哪4种最基本的总线操作(周期)?处理器8086有3个基本读写引脚:M/IO*、WR*和RD*(其中*号表示低电平有效),说明它们在进行这4种基本总线操作时的高低电平状态。
存储器读、存储器写,I/O读、I/O写。
内存读取
M/IO* = 1
RD* = 0
WR* = 1
这表示处理器要从内存中读取数据,因此将M/IO引脚置为1表示要访问内存(而不是I/O端口),同时将RD引脚置为低电平(有效)表示要进行读取操作。
内存写入
M/IO* = 1
RD* = 1
WR* = 0
这表示处理器要向内存中写入数据,因此将M/IO引脚置为1表示要访问内存(而不是I/O端口),同时将WR引脚置为低电平(有效)表示要进行写入操作。
I/O读取
M/IO* = 0
RD* = 0
WR* = 1
这表示处理器要从I/O端口中读取数据,因此将M/IO引脚置为0表示要访问I/O端口,同时将RD引脚置为低电平(有效)表示要进行读取操作。
I/O写入
M/IO* = 0
RD* = 1
WR* = 0
这表示处理器要向I/O端口中写入数据,因此将M/IO引脚置为0表示要访问I/O端口,同时将WR引脚置为低电平(有效)表示要进行写入操作。
部分译码产生的地址重复是什么?
部分译码只使用部分系统地址总线进行译码。有一个没有被使用的地址信号就有两种编码,这两个编码指向同一个存储单元,出现地址重复,也就是一个存储单元占有多个存储器地址。
大小写字母转换使用了什么规律?
大小写字母转换利用它们的 ASCII 码相差 20H。
如大写字母“A”的ASCII码值为41H(01000001B),D5=0.而小写字母“a”的ASCII码值为61H(01100001B)D5=1.和数据”00100000B“相异或则改变字母大小写。
I/O地址(端口)的统一编址有什么特点?
统一编址方式,处理器不再区分I/O口访问和存储器访问。其优点是:处理器不用设计I/O指令和引脚,丰富的存储器访问方法同样能够运用于I/O访问。缺点是:I/O端口会占用存储器的部分地址空间,通过指令不易辨认I/O操作。
参数传递的“传值”和“传址”有什么区别?
“传值”是传递参数的一个拷贝,被调用程序改变这个参数不影响调用程序;
“传址”时,被调用程序可能修改通过地址引用的变量内容。
处理器的字长(Word)指的是什么,处理器的总线(引脚)分成哪3组信号?
字长通常是指处理器每个单位时间可以处理的二进制数据位数。
总线信号分成三组,分别是数据总线、地址总线和控制总线。
说明如下ADD指令执行后,标志CF、ZF、SF、OF和PF的状态依次是什么?
mov al,89h
add al,al
mov al,89h ;AL=89h 1000 1001
add al,al ;AL=12h 、CF=1 、ZF=0 、SF=0 、OF=1 、PF =1 0001 0010
mov al,89h ; AL=89h CF ZF SF OF PF
add al,al ; AL=12h 1 0 0 1 1
; 1000 1001
+1000 1001
10001 0010