汇编语言程序设计题,汇编语言程序设计题
汇编语言程序设计题,汇编语言程序设计题详细介绍
本文目录一览: 汇编语言程序设计题
一、
assume cs:code
code segment
start:
mov cx,1000
; 累加1000次
call jslj
; 调用奇数累加子函数
mov ax,4c00h
int 21h
jslj:
;功能:从1开始奇数累加子函数
;入口参数:CX累加次数
;出口参数:AX累加结果
push bx
; 保存BX
xor ax,ax
; 清空AX
mov bx,1
; 初始化第1个奇数
lop:
add ax,bx
; 累加至AX
inc bx
inc bx
; BX加2
loop lop
pop bx
ret
code ends
end start
二、
assume cs:code
code segment
start:
mov ax,2000h
mov ds,ax
mov es,ax
mov si,200h
mov di,800h
mov cx,200
rep movsb
code ends
end start
汇编语言程序设计题
我写的有点长,经验证,运行无误。
代码贴在:任意两个10位以内十六进制数求和
http://tieba.baidu.com/f?kz=681706003
如是能用的,请顶一下。
为了方便修改,新代码直接贴在我的百度空间。
新代码添加了无输入处理和清除前导空格指令。
经验证,无楼主提到的‘1111111111+1111111111=42222222222’
的BUG,显示运算结果准确。
附言:21H的10号(0AH)功能,无法滤除:G~Z,所以不能用;
汤旺河边 错在: rcl al,1 ;把进位标志移入AL.
MOVSB
的英文是
move
string
byte,意思是搬移一个字节,它是把
DS:SI
所指位址的一个位元组搬移到
ES:DI
所指的位址上,搬移后原来的内容不变,但是原来
ES:DI
所指的内容会被覆盖而且在搬移之后
SI
和
DI
会自动地址向下一个要搬移的位址。
一般而言,通常程序设计师只搬一个字节,通常都会重复很多次,如果要重复的话,就得把重复次数先存储在
CX
寄存器,并在
MOVSB
之前加上
REP
指令。
宏和子程序都是为了简化源程序的编写,提高程序的可维护性,但是它们二者之间存在着以下本质的区别:
1、在源程序中,通过书写宏名来引用宏,而子程序是通过CALL指令来调用;
2、汇编程序对宏通过宏扩展来加入其定义体,宏引用多少次,就相应扩展多少次,所以,引用宏不会缩短目标程序;而子程序代码在目标程序中只出现一次,调用子程序是执行同一程序段,因此,目标程序也得到相应的简化;
3、宏引用时,参数是通过“实参”替换“形参”的方式来实现传递的,参数形式灵活多样,而子程序调用时,参数是通过寄存器、堆栈或约定存储单元进行传递的;
4、宏引用语句扩展后,目标程序中就不再有宏引用语句,运行时,不会有额外的时间开销,而子程序的调用在目标程序中仍存在,子程序的调用和返回均需要时间。
mov
bx,offset
data
mov
al,0
mov
cx,100
next:
mov
[bx],al
inc
bx
loop
next
后面的自己动手解决吧!
偷懒可是不好的行为,很少有高手愿意来做这种没有技术含量的书本知识了。
再说全是书上的概念,有必要发出来么。
自己翻翻书不就完了。迎难而上,方显男儿本色。
DATAS SEGMENT
STR1 DB 'The first number a is(eight byte):$'
STR2 DB 'The second number b is(eight byte):$'
STR3 DB 'The answer of the a+b=$'
D1 DB 02FH,03FH,04FH,02FH,02FH,02FH,0FH,0H ;预设要相加的两个八字节数,可任意设置
D2 DB 0H,0F2H,0F2H,0F2H,0F4H,0F4H,0F4H,0H
D3 DB 100 DUP(0)
DATAS ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACK
MAIN PROC FAR
START:
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET STR1 ;输出第一个八字节数
MOV AH,9
INT 21H
LEA DI,D1 ;因为D1中低位在前,高位在后,所以输出D1要倒着输出
ADD DI,7
MOV CX,8
CALL XS
MOV DX,0AH ;回车换行
MOV AH,2
INT 21H
MOV DX,0DH
MOV AH,2
INT 21H
MOV DX,OFFSET STR2 ;同理,输出D2
MOV AH,9
INT 21H
LEA DI,D2
ADD DI,7
MOV CX,8
CALL XS
MOV DX,0AH ;回车换行
MOV AH,2
INT 21H
MOV DX,0DH
MOV AH,2
INT 21H
MOV DX,OFFSET STR3
MOV AH,9
INT 21H
MOV SI,OFFSET D1 ;调用XJ子程序作八字结数相加
MOV DI,OFFSET D2
MOV BX,OFFSET D3
MOV CX,4
CALL XJ
JNC L1
MOV [BX],1 ;CF=1,最高位置1
L1:LEA DI,D3
ADD DI,8
MOV CX,9
CALL XS ;输出相加的结果
RET
MAIN ENDP
MOV DL, 0DH
MOV AH, 2H
INT 21H
MOV DL, 0AH
MOV AH, 02H
INT 21H
XJ PROC
CLC
AA:MOV AX,[SI] ;用循环实现八字节相加,两字节两字节进行
ADC AX,[DI]
MOV [BX],AX
PUSHF
ADD SI,2
ADD DI,2
ADD BX,2
POPF
LOOP AA
RET
XJ ENDP
XS PROC
LP2:MOV AL,[DI]
MOV BL,AL
PUSH CX
MOV CL,4
SHR AL,CL ;右移4位
CALL PP ;第一次调用输出每个字节的高4位
MOV AL,BL
CALL PP ;第二次调用输出每个字节的低4位
POP CX
DEC DI
LOOP LP2 ;循环分别输出结果的9个字节
RET
XS ENDP
PP PROC
AND AL,0FH ;取AL中的低4位
CMP AL,10 ;比较低4位与10的大小
JB S ;小于,则直接输出低4位
ADD AL,7 ;否则加7后再输出
S:ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
RET
PP ENDP
MOV AH,4CH
INT 21H
CODES ENDS
END START
希望能够帮到你!(*^__^*) 嘻嘻……
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。虽不敢说万无一失,但自信无虞;请楼主严格测试,若还有误,本回答作废。
; 题目名称:键盘输入两个10位数以内(位数可变)十六进制数,求和并显示输出
; 题目来源:http://zhidao.baidu.com/question/129269410.html
; 操作说明:输入两个10位数以内(位数可变)十六进制数时,输足10位,自动结束输入;不足10位,按回车键结束输入。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:在当前光标位置显示一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr Endp
; -------------------------------------
; 功能:显示、输出一个回车、换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF Endp
; -------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH CS
POP DS
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
POP DS
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH CS
POP DS
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
POP DS
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数(N)的十六进制数字,保存在指定的存储单元
; 输足N位的,自动结束输入;不足N位的,回车结束输入。
; 入口:@@Hexadec=数字位数,ds:di=输入数据保存地址
; 出口:保存在指定的存储单元
Input_Hex Proc Near
push es
push di
push cx
push ax
push ds
pop es
mov cx,cs:@@Hexadec ;十六进制数位数
cld
push cx
xor al,al
rep stosb ;数据缓冲区清零
pop cx
dec di
@@Input_Hex: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,CR ;回车?已经键入的十六进制字符不足N位
jz @@Return_Hex
cmp al,KBBack ;回空键?
jz @@KB_Back ;是,重新输入
cmp al,'0' ;低于数字'0'?
jb @@KBBack ;是,重新输入
cmp al,'9';低于或等于数字'9'?
jbe @@Convert_Bin ;是,转去转换成二进制数
and al,0dfh ;对高于数字'9'的字符视为字母并转换成大写,以便判断是否是A~F之间的字母
cmp al,'A' ;低于字母'A'?
jb @@KBBack ;是,重新输入
cmp al,'F' ;高于字母'F'?
ja @@KBBack ;高于字母'F',重新输入
sub al,7 ;使低4位等于对应字母的十六进制值
@@Convert_Bin: and al,0fh ;转换成二进制数
push ax ;入栈保存
loop @@Input_Hex ;接受下一个数字
@@Return_Hex: mov ax,cx
mov cx,cs:@@Hexadec
sub cx,ax
jcxz @@Return_pop
std
@Reverse_Order:pop ax
stosb ;保存
loop @Reverse_Order
@@Return_pop: pop ax
pop cx
pop di
pop es
ret
@@KB_Back: cmp cx,cs:@@Hexadec ;十六进制数位数
jz @@Input_Hex
inc cx
dec di
dec Cursor_Col
@@KBBack: call SetCursor ;置光标位置
jmp @@Input_Hex
@@Hexadec dw ? ;数字位数
Input_Hex EndP
; -------------------------------------
; 功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 ;AL<10?
jb @@To_ASCII ;AL<10,按数字处理
add al,7 ;AL>=10,按大写字母处理
@@To_ASCII: add al,'0' ;转换成相应的数字或大写字母
ret
AL_ASCII EndP
; -------------------------------------
; 功能:键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回
; 入口:无
; 出口:若输入的是'y',进位标志置位;若输入的是'n',进位标志复位。
Yes_or_No proc Near
push dx
push ax
@@Input_Chr: mov ah,7 ;不带回显的键盘输入
int 21h
mov dl,al
and al,0dfh
cmp al,'Y'
jnz $+5
stc
jmp $+7
cmp al,'N'
jnz @@Input_Chr
clc
mov ah,2
int 21h
pop ax
pop dx
ret
Yes_or_No Endp
; -------------------------------------
N equ 10 ;数据位数
Summand db N dup(?) ;被加数
Addend db N dup(?) ;加数
Sum db N+1 dup(?) ;和
Prompt_Str1 db 'Please input the summand:$' ;“输入被加数”提示信息
Prompt_Str2 db 13,10,'Please input the addend:$' ;“输入加数”提示信息
Prompt_Str3 db 13,10,'The sum:$' ;“显示相加之和”提示信息
Prompt_Str4 db 13,10,13,10,'Do you want to continue(y/n)?$' ;“继续做加法?”提示信息
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
; -------------------------------------
Start: push cs
pop ds
push cs
pop es
mov @@Hexadec,10 ;数字位数
Addition_Hex: lea di,Sum ;相加和存放地址
mov cx,N+1
xor al,al
cld
rep stosb ;相加之和初始值清零
Output Prompt_Str1 ;提示输入被加数
lea di,Summand ;被加数存放地址
call Input_Hex ;键盘输入一个指定位数(N)的十六进制数字,保存在指定的存储单元
Output Prompt_Str2 ;提示输入加数
lea di,Addend ;加数存放地址
call Input_Hex
mov si,9 ;个位数下标
lea di,Sum[10] ;相加之和个位数存放地址
mov cx,10 ;数据位数
std
clc ;进位标志位复位
Addition: mov al,Summand[si] ;读入一位被加数
adc al,Addend[si] ;加上加数
push cx
xor ah,ah
mov cx,4
shl ax,cl ;左移4位,把进位标志位移到AH
shr al,cl ;右移4位,把AL的低4位移回
pop cx
stosb ;保存相加结果
rcr ah,1 ;带进位循环右移1位,把进位结果移至标志位
dec si
loop Addition
mov al,ah
rcl al,1 ;把进位标志移入AL
test al,al
jz $+3
stosb ;保存最高位进位
Output Prompt_Str3 ;提示显示相加和
mov cx,N+1
lea di,Sum ;相加和存放地址
xor al,al
cld
repz scasb ;扫描相加和最高有效位
dec di
inc cx
mov si,di ;相加和最高有效位地址
@@Output_Data: lodsb ;读入1位相加和结果
call AL_ASCII ;将AL中的低4位二进制数转换成十六进制显示的ASCII码
mov dl,al
call Output_Chr ;显示一个字符
loop @@Output_Data
Output Prompt_Str4 ;提示是否继续做十六进制加法
call Yes_or_No ;键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回
call Output_CTLF ;显示、输出一个回车、换行
call Output_CTLF
jc Addition_Hex
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
汇编语言程序设计题目
一、改错(只能对每条错误指令的一个操作数进行修改)。(共10分,每小题1分)
1. MOV BX,AL 改正: MOV BX,BX
2. MOV AX, A999H 改正:MOV AX,0A999H
3. MOV AL, 1234 改正:MOV AX,1234
4. MOV AX, [CX] 改正:MOV AX,[BX]
5. MOV DS, 1000H 改正:MOV AX,1000H MOV DS,AX
6. ADD [BX],10 改正: ADD BYTE PTR [BX],10
8. PUSH AH 改正:PUSH AX
9. INC [BP] 改正:INC BYTE PTR [BP]
9. MOV [DI],WORD PTR [SI] 改正:MOV DI,WORD PTR [SI]
10. MUL 10 改正:MOV CX,10 MUL CX
AX是改单片机的累加器或者工作寄存器吗?
(汇编语言程序设计〉半期试题请求解答
2012年〈汇编语言程序设计〉半期试题(堂下开卷)
一.名词解释(本大题共5小题,每小题3分,共15分)试解释下列名词的含义。
1. 逻辑地址:在CPU内部的存储单元地址表示形式,分为段基值和偏移量两个组成部分,
它们都是16位的,在指令或源程序中只能使用逻辑地址来表达存储单元。
2. 物理地址:CPU访问存储单元时向地址总线传送的地址表示形式,是20位的地址,由
逻辑地址中段基值乘以16再加上偏移量得到,逻辑地址到物理地址的转换由CPU在执行访问存储单元的指令时自动完成。
3. 标志寄存器:在CPU中由状态标志位与控制标志位组成的寄存器称为标志寄存器,其
中状态标志位用于标识运算指令执行后运算结果的特征,控制标志位用于控制CPU的工作模式或改变CPU对某些事件的响应方式。
4. 存储器寻址方式:即获得存储单元地址的方式,在8086/8088CPU中包括直接寻址、寄
存器间接寻址、基址寻址、变址寻址、基址变址寻址这五种寻址方式。
5. 补码:CPU内部用于表示带符号数的一种编码,正数的补码为真值本身,负数的补码为
真值变反加1的结果。
二.计算题(本大题共5小题,每小题4分,共20分)试按照各小题的要求给出计算结果。
1. 将十进制数100分别转换为二进制、十六进制数,它们的表示形式分别为多少? 答:100的十六进制表示为64H,二进制表示为01100100B。 2. 假设(DS)=0B00H,(BX)=0210H,对于指令MOV DS:120H[BX],AL,其目的
操作数的物理地址为多少?
答:EA=(BX)+120H = 0210H+0120H = 0330H,物理地址 = (DS)*16+EA = 0B000H+0330H=0B330H。 3. 假设(BX)=0210H,(DI)=0060H,对于指令ADD DL,[BX][DI],其源操作数的偏
移量为多少?
答:源操作数EA = (BX)+(DI)= 0210H+0060H =0270H。 4. 假设当前(SP)=0060H,连续执行5条PUSH指令后,(SP)=? 答:(SP)=0060H – 5*2 = 0060H – 000AH = 0056H
5. 对于一个十进制数 – 65,其二进制补码表示形式为多少?
答:先将数值转换为二进制表示: - 65 = - 41H = - 01000001B ,由于是负数,变反加1得到补码形式:10111110B +00000001B = 10111111B
三.排错题(本大题共4小题,每小题5分,共20分)每小题列出了一条指令,判断该指
令有无语法错误,如果存在语法错误,请指出具体的错误原因,判断正确给2分,分析正确给3分,判断错误不给分。
1. PUSH 5588H
答:错误,单操作数指令不能使用立即数寻址方式。 2. MOV DS, 1720H
答:错误,MOV指令不能将立即数直接传送至段寄存器,需要通用寄存器作为中转。 3. ADD AX, CL
答:错误,两个操作数的类型不匹配,AX为16位,CL为8位。 4. AND AX,[DX]
答:错误,DX寄存器不能用作存储器寻址方式中的基址或变址分量。
四.程序分析题(本大题共6小题,每小题5分,共30分)每小题列出了一段小的程序片
段和相关存储单元的初始值,请按题目的要求分析各程序片段的运行结果。(寄存器中的内容请使用十六进制形式给出)
1. 阅读如下程序片段
MOV AL,4CH MOV BL,0B5H ADD AL,BL
执行上述程序片段后,(AL)= 01H (1分),(BL)= 0B5H (1分), CF= 1 (1分),OF= 0 (1分),PF= 0 (1分)
2. 阅读如下程序片段
MOV AL,0F3H MOV DL,0C4H ADD AL,DL AND AL,0FH
执行上述程序片段后,(AL)= 07H (1分),(AF)= 不确定 (1分), CF= 0 (1分),OF= 0 (1分),PF= 0 (1分)
3. 阅读如下程序片段
MOV AL,7EH MOV CL,04H ROL AL,CL
执行上述程序片段后,(AL)= 0E7H (2分),(CL)= 04H (1分), CF= 1 (1分),OF= 不确定 (1分)
4. 阅读如下程序片段
MOV AX,0632H MOV BX,0C202H SUB AX,BX INC AX
执行上述程序片段后,(AX)= 4431H (2分),(CF)= 1 (2分), OF= 0 (1分)
5. 阅读如下程序片段,假设(DS)=0100H,字节单元(01024H)=56H,字节单元(01025H)
=28H
MOV BX,0024H LEA BX,[BX] OR BX,0 ADC BX,[BX]
执行上述程序片段后,(BX)= 287AH (3分),(CF)= 0 (2分), OF= 0 (1分)
6. 阅读如下程序片段,假设(SP)=0064H
MOV AX,0001H MOV BX,0002H PUSH AX PUSH BX POP CX POP BX
执行上述程序片段后,(AX)= 0001H (2分),(BX)= 0001H (2分), (SP)= 0064H (1分)
五.程序设计题(本大题共2小题,第一小题7分,第二小题8分,共15分)
1. 试编写一程序片段,实现BL高4位与低4位相互交换(7分) 答:
mov cl, 4 rol bl, cl
2. 试编写一程序片段,不使用乘除法指令,实现((AX)*5+14)/ 2的功能(AX中的数
据理解为补码)(8分) 答:
mov bx, ax mov cl, 2 sal ax, cl add ax, bx add ax, 14 sar ax, 1
.汇编语言程序设计考题,求高手解答
一、判断题(5道小题,共15分)
1、MASM汇编语言的注释用分号开始,无所谓英文分号、还是中文分号。(3分)
错误
2、按照MASM语法编程时,可以将SHL作为8086指令的标号。(3分)
错误
3、指令“mov ax,ds:[100h]”中,若DS=1400H,则源操作数来自主存物理地址1500H。(3分)
错误
4、汇编结束END语句表明程序执行到此结束。(3分)
错误
5、指令的操作数使用存储器寻址方式,说明操作数保存在主存储器中。(3分)
正确
二、单项选择题(5道小题,共15分)
1、某个8086存储单元的逻辑地址为A400H:2400H,其物理地址是__B、A6400H__。(3分)
A、D7000H B、A6400H
C、3D400H D、0A640H
2、在8086处理器中,用来指示当前堆栈顶部的寄存器是__A、SP__。(3分)
A、SP B、IP
C、BP D、SS
3、已知字变量BUFFER内容等于1234H,保存于主存数据段偏移地址为5678H位置,
执行指令“MOV AX, BUFFER”后,AX=__C、3412H__。(3分)
A、7856H B、5678H
C、3412H D、1234H
4、汇编语言程序定义符号常量max等于100,正确的表达是__A、max = 100__。(3分)
A、max = 100 B、max db 100
C、max dw 100 D、max org 100
5、堆栈的操作原则可以描述为__B、后进后出__。(3分)
A、先进先出 B、后进后出
C、先进后出 D、循环
汇编语言程序设计试题,高手来!
1.唯一代表存储空间中每个字节单元的地址是___物理地址___。
2.JNC指令转移的测试条件是__C=0____。
3.将端口地址为30H中的数据传送到CPU中的指令是__IN AL, 30H__。
4.8086微处理系统中最多有__1024__个端口地址。
5.判断无符号数运算是否溢出,应根据__进位标志_C__标志位;而判断有符号数运算是否溢出应根据__溢出 OV___标志位。
6.执行 INT 10H指令,可从中断向量表__0040H___地址读出内容送IP,从__0042H___地址单元读出内容送CS。
7.语句 ASC DB ‘1234’设置了__4__个字节。
8.某微机有16条地址线,能够覆盖的地址范围是_0000H~FFFFH__。
9.8086CPU允许的最大存储空间为_1M 字节_,其地址编号从_00000H_到__FFFFF_H。
10.把AX中第0、1、3位清零,应使用的指令是_AND AX, 0FFF2H__。
11.设寄存器位数为8位,机器数采用补码形式(含一位符号位)。对应于十进制数-73的寄存器内容为__B7H___(用16进制表示)。
12.设A为字变量,指令MOV AX, A的源操作数寻址方式是__立即数寻址___。
LS第10题、第12题回答错误。
1.唯一代表存储空间中每个字节单元的地址是: 物理地址。
2.JNC指令转移的测试条件是: 进位标志位复位,即CF=0(源操作数不小于目的操作数)。
3.将端口地址为30H中的数据传送到CPU中的指令是: IN AL,30H。
4.8086微处理系统中最多有 1024 个端口地址。
5.判断无符号数运算是否溢出,应根据 进位 标志位;而判断有符号数运算是否溢出应根据 溢出 标志位。
6.执行 INT 10H指令,可从中断向量表 40H 地址读出内容送IP,从 42H 地址单元读出内容送CS。
7.语句 ASC DB ‘1234’设置了 4 个字节。
8.某微机有16条地址线,能够覆盖的地址范围是: 0000H~0FFFFH。
9.8086CPU允许的最大存储空间为 1M字节,其地址编号从 0000H 到 FFFFH H。
10.把AX中第0、1、3位清零,应使用的指令是: AND AX,0FFF4H。
11.设寄存器位数为8位,机器数采用补码形式(含一位符号位)。对应于十进制数-73的寄存器内容为: B7H(用16进制表示)。
12.设A为字变量,指令MOV AX, A的源操作数寻址方式是: 存储器直接寻址。
汇编语言程序设计(高起专) 求大神帮助回答以下两道题
1(1)ADD VAR1,VAR2------两个操作数不能同时为内存单元(2)SUB AL,VAR1--------第2个操作数为字单元,不匹配(3)JMP LAB[SI]--------标号不能进行变址寻址(4)JNZ VAR1-----------不能转到变量,只能转到标号(5)JMP NEAR LAB-------near 多余2(1)MOV BP,AL----------------------------传送的类型不匹配(2)MOV WORD_OP[BX+4*3][DI],SP-----------正确(3)MOV WORD_OP1,WORD_OP2----------------传送指令两个操作数不能同为内存单元(4)MOV AX,WORD_OP1[DX]------------------dx 不能作为基址或变址寄存器(5)MOV SAVE_WORD,DS---------------------DS 段寄存器只能通过ax传递(6)MOV SP,SS:DATA_WORD[BX][SI]----------ss 段寄存器使用错误(7)MOV [BX][SI],2-----------------------未指定传送立即数的类型(8)MOV AX,WORD_OP1+WORD_OP2-------------源操作数部分所代表的内存数据不能相加(9)MOV AX,WORD_OP1-WORD_OP2+100---------问题同上(10)MOV WORD_OP1,WORD_OP1-WORD_OP2------问题 同上、同(3)
真无聊!
我们学习汇编语言,能够把握住“指令系统”就很了不起了。
学习这些错误干嘛?
这些难得一见的错误指令,不都是垃圾吗?
这些,是“知识”吗?
学校,应该教什么,他们自己还没搞清楚!
汇编语言程序设计习题
1.写出下列程序段执行的结果,(AL)=? (DL)=?
并指出此程序段完成的是什么功能?
MOV CL, 4
MOV AL, 87d=57H
MOV DL, AL
AND AL, 0FH
OR AL, 30H
SHR DL, CL
OR DL, 30H
(AL)=37H (DL)=35H
程序段完成功能是:把AL中的16进制数高位送DL,移位取出低位,
再分别转化为对应的ASCII码.
2.假定DS=2100H,BX=0100H,SI=0002H;
[21100H]=12H,[21101H]=34H,[21102H]=56H,[21103H]=78H。
2100:100H=12H,34H,56H,78H
分析下列指令执行后寄存器的内容。
(1) MOV AX,[101H] ;ax=5634H
(2) MOV AX,[BX+2] ;ax=[0102H]=7856H
(3) MOV AL,[BX][SI+1] ;al=[0103H]=78H
(4) MOV AX,100H[SI] ;ax=[0102H]=7856H
3.识别下列指令正确与否,对错误指令,说明出错的原因。
(1) MOV DS,100 × ;数据段不允许用立即数赋值
(2) MOV [1000H],23H ×;立即数送入内存需指明是字还是字节
(3) MOV [1000H],[2000H] ×;源和目标不能同为内存数
(4) MOV DATA,1133H ? ;如用DATA定义过数据段,DATA就不能再用作变量名
(5) MOV 1020H,DX ×;目标不能是立即数
(6) MOV AX,[0100H+BX+BP] ×;寻址时,BX、BP只能用一个
(7) MOV CS,AX ×;CS不能直接赋值
(8) PUSH AL ×;堆栈不能压入字节,只能压入字(32位压入双字)
(9) PUSH WORD PTR[SI] √
(10) IN AL,378H ×;端口寻址大于0FFH,端口号源要放入DX
(11) OUT 80H,AX √
(12) MOV CX,[AX+SI]×;AX不能用于内存寻址
求教:一个汇编语言的程序设计题
data segment
record db 100 dub (?)
g6 db 0
g7 db 0
g8 db 0
g9 db 0
g10 db 0
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea si,record
mov cx,100
next:
mov al,[si]
cmp al,60
jb nextn
cmp al,70
jnb next7
inc g6
jmp nextn
next7:
cmp al,80
jnb next8
inc g7
jmp nextn
next8:
cmp al,90
jnb next9
inc g8
jmp nextn
next9:
cmp al,100
jnb next10
inc g9
jmp nextn
next10:
jne nextn
inc g10
nextn:
inc si
loop next
mov ah,1
int 21h
mov ax,4c00h
int 21h
code ends
end start
求汇编语言程序设计高手,几道题,感激不尽!!
多项选择题
1、汇编语言中,B C 可以作为有效的名字,如标号、变量名等。
A、0fffh
B、var00
C、loop1
D、test
E、add
2、使用MASM 6.x版本的“ML /Fl lt401.asm”命令,如果源程序lt401.asm没有语法错误,则将生成 A B C 文件。
A、目标代码文件
B、可执行文件
C、列表文件
D、调试文件
E、库文件
3、汇编语言中,程序员不能将 A B D E 作为用户标识符。
A、DS
B、byte
C、again
D、test
E、SS
4、在汇编语言程序定义常量max等于100,正确的表达是 A B 。
A、max = 100
B、max equ 100
C、max db 100
D、max dw 100
E、max org 100
5、真值18,在汇编语言程序用db定义变量初值,正确的表达是 B C D E。
A、18h
B、18
C、12h
D、00010010b
E、12H
6、用JZ实现AX最高位等于0转移,前面可以使用 A C 指令产生条件。
A、test ax,80h
B、shl ax,1
C、and ax,80h
D、test ax,0
E、cmp ax,80h
7、过程定义伪指令定义的过程名可能具有 D E 属性。
A、BYTE
B、WORD
C、DWORD
D、FAR
E、NEAR
8、例题4.7循环结构的程序中,从标号again到jmp again之间的程序段包含了_______部分。
A、循环初始
B、循环体
C、循环控制
D、多重循环
E、循环次数设置
晕,谁知道例题是什么,不过标号到跳转语句之间,应该就是循环体部分,一定是包含了 B C ,不知道有没有 D 。
9、用JZ实现AX=0转移,前面可以使用 A B C 指令产生条件。
A、sub ax,0
B、add ax,0
C、cmp ax ,0
D、test ax,0
E、and ax,0
10、循环结构的程序通常包括 A C D 部分。
A、设置循环初值
B、调用循环
C、循环体
D、循环控制
E、循环返回