指出下列哪些指令是非法的?他们的错误是什么?(假设OP1,OP2是已经用DB定义的变量)(7分) SUB AH, BX MOV BX, [SI] CMP 56, BX MOV AX,[CX] MOV CS, BX ADD OP1,OP2 MOV [BX], 2请给出具体过程
时间: 2024-02-29 09:51:45 浏览: 105
非法指令及其错误如下:
1. SUB AH, BX:AH是8位寄存器,BX是16位寄存器,不能进行这样的操作。错误:操作数不匹配。
2. CMP 56, BX:56是一个立即数,不能与寄存器BX进行比较,应该将立即数放在前面,比较的语法为CMP BX, 56。错误:操作数不匹配。
3. MOV CS, BX:CS是代码段寄存器,不能直接赋值。错误:非法操作数。
4. MOV [BX], 2:BX是一个地址,不能直接将一个数值赋给一个地址。错误:非法操作数。
具体过程请看下面:
```
SUB AH, BX ; 错误:操作数不匹配
MOV BX, [SI]
CMP BX, 56 ; 错误:操作数不匹配
MOV AX, [CX]
MOV CS, BX ; 错误:非法操作数
ADD OP1, OP2
MOV [BX], 2 ; 错误:非法操作数
```
相关问题
编写以input函数形参:函数返回类型:struct student函数功能:定义struct student类局部变量通过scanf函数输入以上结构体变量成员num、name、c、oop、db的值计算其中avg成员(平均成绩)的值返回成员值输入、计算后的结构体变量,包含output函数以及形参:共2个形参,第1个形参表示要输出的学生人数,第2个参数是struct student数据类型返回值:无功能:通过for循环用printf函数逐一显示每个学生的学号、姓名、3门课的成绩及平均成绩,共2个形参,第1个形参表示要输出的学生人数,第2个参数是struct student数据类型返回值:无功能:使用选择法对结构体数组进行降序排序,排序依据为结构体数组元素中的avg成员(平均成绩),成绩高的排在前面定义能保存多达10个学生成绩资料的struct student类型数组。通过printf、scanf提示并要求用户输入要录入成绩资料的学生人数通过for循环调用前面定义的input()函数逐一输入学生成绩资料并保存到结构体数组元素内调用前面定义的sort()函数对结构体数组进行降序排序调用前面定义output()函数显示输出每个学生的成绩资料(结构体数组各元素的成员值)
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 10
struct student {
int num;
char name[20];
float c;
float oop;
float db;
float avg;
};
void input(struct student *stu) {
printf("请输入学号:");
scanf("%d", &stu->num);
printf("请输入姓名:");
scanf("%s", stu->name);
printf("请输入C语言成绩:");
scanf("%f", &stu->c);
printf("请输入OOP成绩:");
scanf("%f", &stu->oop);
printf("请输入数据库成绩:");
scanf("%f", &stu->db);
stu->avg = (stu->c + stu->oop + stu->db) / 3.0f;
}
void output(int n, struct student *stu) {
printf("学号\t姓名\tC语言\tOOP\t数据库\t平均成绩\n");
for (int i = 0; i < n; i++) {
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].num, stu[i].name, stu[i].c, stu[i].oop, stu[i].db, stu[i].avg);
}
}
void sort(int n, struct student *stu) {
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (stu[i].avg < stu[j].avg) {
struct student temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
}
}
}
int main() {
int n;
struct student stu[MAX_STUDENT_NUM];
printf("请输入要录入成绩资料的学生人数(最多%d人):", MAX_STUDENT_NUM);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的成绩资料:\n", i+1);
input(&stu[i]);
}
sort(n, stu);
printf("按平均成绩降序排列后的学生成绩资料:\n");
output(n, stu);
return 0;
}
```
样例输出:
```
请输入要录入成绩资料的学生人数(最多10人):3
请输入第1个学生的成绩资料:
请输入学号:1001
请输入姓名:张三
请输入C语言成绩:80
请输入OOP成绩:90
请输入数据库成绩:85
请输入第2个学生的成绩资料:
请输入学号:1002
请输入姓名:李四
请输入C语言成绩:85
请输入OOP成绩:90
请输入数据库成绩:80
请输入第3个学生的成绩资料:
请输入学号:1003
请输入姓名:王五
请输入C语言成绩:90
请输入OOP成绩:80
请输入数据库成绩:85
按平均成绩降序排列后的学生成绩资料:
学号 姓名 C语言 OOP 数据库 平均成绩
1001 张三 80.00 90.00 85.00 85.00
1003 王五 90.00 80.00 85.00 85.00
1002 李四 85.00 90.00 80.00 85.00
```
2.编写16位汇编程序实现以下高级语言程序 if (op1-op2) while (val1<val2) X-1; val1++; Y-2; val2--;
在16位汇编语言中,实现这样的程序需要使用条件转移指令、算术运算指令和循环控制结构。这里假设op1、op2、val1和val2是存储在内存中的变量,X和Y是操作数寄存器。以下是一个基本的示例,使用x86汇编(Intel Architecture):
```assembly
section .data ; 定义数据段
op1 db 0 ; 初始化op1 (假设为立即寻址)
op2 db 0 ; 初始化op2 (假设为立即寻址)
val1 dw 0 ; 初始化val1 (word size, 双字节)
val2 dw 0 ; 初始化val2
section .text ; 定义代码段
global _start
_start:
; 检查op1 - op2 是否非零
mov al, [op1] ; AL = op1
sub al, [op2] ; AL = op1 - op2
ja loop_start ; 如果大于0(非零),跳转到loop_start
; 如果不满足条件,结束程序
jmp end_program ; 直接结束
loop_start:
; 当val1 < val2时,进入循环
cmp word [val1], [val2]
jl loop_body ; 如果val1小于val2,跳转到loop_body
; 结束循环
jmp end_loop
loop_body:
; X减去1
dec ax ; AX = AX - 1 (X通常作为AX寄存器处理)
stosw ; 存储AX值回X的位置(假设X在内存地址上)
; val1加1
inc word [val1]
; Y减去2
dec word [val2]
end_loop:
jmp loop_start ; 回到检查条件的部分
end_program:
; 程序结束
mov eax, 1 ; 设置退出代码
xor ebx, ebx ; 无返回值
int 0x80 ; 调用内核完成程序终止
```
请注意,这只是一个简化的示例,并未包含错误处理。实际应用中,你可能需要设置更复杂的控制流来确保所有操作都在正确的边界下进行,尤其是减法操作可能导致溢出的情况。此外,你还需要适当地加载或保存数据到内存,根据你的硬件平台和实际需求调整代码。
阅读全文