汇编语言语法与编程实践解析

1、以下哪些是汇编语言中语法正确的变量名?A. RX8 B. 325i C. Total$ D. @1234

A/C

2、假设变量已正确声明,指出以下语句在语法上是否正确。如果不正确,请指出语句的问题所在:A. move cat,5 B. mov dog,cat C. mov eax,ebx D. mov mouse,-7 E. mov 1,frog F. mov horse,ecx

A. 不正确,指令拼写错误,应为 `mov`;  
B. 若 `cat` 是内存变量,此语句将内存数据移到内存,违反 `mov` 不能直接从一个内存位置移到另一个内存位置的规则;  
C. 正确;  
D. 正确;  
E. 不正确,不能将立即数作为目的操作数;  
F. 正确。

3、假设所有变量都声明为sdword类型,编写汇编语言指令来实现以下每个C语句或代码段:A. i = 1; B. x = y; C. c = 2; b = c; a = b; D. x = y = 1;

A. `mov i, 1;`  
B. `mov eax, y; mov x, eax;`  
C. `mov c, 2; mov eax, c; mov b, eax; mov eax, b; mov a, eax;`  
D. `mov eax, 1; mov y, eax; mov x, eax;`

4、假设所有变量都声明为字节类型,编写汇编语言指令来实现以下每个C语句或代码段:A. a = ‘B’; B. b = c; C. d = ‘E’; e = d; D. d = ‘z’; a = d; b = a;

A. .data
  a byte ?
.code
  mov a, 'B'

B. .data
  b byte ?
  c byte ?
.code
  mov al, c
  mov b, al

C. .data
  d byte ?
  e byte ?
.code
  mov d, 'E'
  mov al, d
  mov e, al

D. .data
  a byte ?
  b byte ?
  d byte ?
.code
  mov d, 'z'
  mov al, d
  mov a, al
  mov al, a
  mov b, al

5、判断下列语句在语法上是否正确。如果不正确,请指出语句的问题所在:A. printf PROTO arg1:Ptr Byte, printlist:VARARG B. msg1fmt byte “\n%s%d\n”,0 C. INVOKE printf, ADDR msg1fmt, ADDR number D. msg2fmt byte 0Ah,0Ah„”%s”,0Ah,0Ah,0

A. 正确。该语句正确声明了`printf`函数的原型,使用了`PROTO`指令,指定了第一个参数为指向字节的指针,且支持可变数量的参数。

B. 正确。该语句定义了一个字节类型的字符串`msg1fmt`,字符串以0结尾,符合汇编语言中字符串的定义规则。

C. 若`number`是简单整数变量,使用`ADDR`是错误的;若`number`是字符串指针,使用`ADDR`是正确的。

D. 错误。语句中存在错误字符„,应将其修正为正确的字符。

6、假设.data段设置正确,以下代码段的逻辑有什么问题?如何重写以避免该问题?mov num1,5 mov eax,num1 INVOKE printf, ADDR msg1fmt, ADDR msg1, num2 mov num2,eax

逻辑问题在于在使用 num2 进行输出时, num2 还未被赋值,其值是不确定的。应先将 num1 的值赋给 num2 ,再进行输出。重写后的代码为:

mov num1, 5
mov eax, num1
mov num2, eax
INVOKE printf, ADDR msg1fmt, ADDR msg1, num2

7、给定以下MASM程序,屏幕上会输出什么?请确保所有内容排列整齐。用小写字母b表示空格,用“blank line”表示空行:.386 .model flat, c .stack 100h printf PROTO arg1:Ptr Byte, printlist:VARARG .data msg1fmt byte “%s%d”,0 msg2fmt byte “%s%d”,0Ah,0Ah,0Ah,0 msg3fmt byte “%s%d”,0Ah,0 msg1 byte “x = “,0 msg2 byte ” y = “,0 msg3 byte “z=”,0 num1 sdword 1 num2 sdword 2 num3 sdword 3 .code main proc INVOKE printf, ADDR msg1fmt, ADDR msg1, num1 INVOKE printf, ADDR msg2fmt, ADDR msg2, num2 INVOKE printf, ADDR msg3fmt, ADDR msg3, num3 ret main endp end

x = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值