汇编语言程序设计题目,.汇编语言程序设计考题,求高手解答
汇编语言程序设计题目,.汇编语言程序设计考题,求高手解答详细介绍
本文目录一览: 求汇编语言程序设计高手,几道题,感激不尽!!
多项选择题
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、循环返回
(汇编语言程序设计〉半期试题请求解答
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、循环
汇编语言程序设计题目
一、改错(只能对每条错误指令的一个操作数进行修改)。(共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是改单片机的累加器或者工作寄存器吗?
汇编语言程序设计(高起专) 求大神帮助回答以下两道题
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)
真无聊!
我们学习汇编语言,能够把握住“指令系统”就很了不起了。
学习这些错误干嘛?
这些难得一见的错误指令,不都是垃圾吗?
这些,是“知识”吗?
学校,应该教什么,他们自己还没搞清楚!
汇编语言程序设计题
我写的有点长,经验证,运行无误。
代码贴在:任意两个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 ;编译到此结束
汇编语言程序 题目请教 求高人解答!
1)编程完成在一个源字符串中搜索子字符串的功能(要求使用串比较指令cmpsb进行各次搜索),并输出搜索结果。
提示:例如,源串为:How are you?
子串为:are
(2)缓冲区BUFFER中存放有字符串,以00h为结束标志。编写程序,把字符串中的空格删除,后续字符依次前移。
(3)从键盘读入一个字符串(长度<80),然后将字符串以与输入相反的顺序显示出来。
(4)3..实验题
设有五个字数据存放在以BUF为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果通过调用显示子程序以16进制形式显示在在屏幕上。
要求:(1)编写主程序以及两个子程序(多个字数据相加的子程序和十六进制形式显示子程序),并将所有子程序和主程序存放在同一文件中进行汇编和连接,最后得到运行结果;
(2)按多模块程序设计方法,将主程序、各子程序作为独立的源程序文件分别进行汇编,然后连接为一个可执行文件。最后运行得到结果。
为了尽快得到答案,楼主应该一个、一个的提出问题。
让一个人编写五个程序,也太难为大家了。
1
DATA SEGMENT
SRC DB 'How are you?'
DES DB 'are'
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV SI,OFFSET SRC
MOV DI,OFFSET DES
LOP: MOV CX,3
CLD
REPZ CMPSB
CMP CX,0
JZ NEXT
MOV DI,OFFSET DES
ADD SI,CX ;si-(3-cx)+1
SUB SI,2
JMP LOP
NEXT: AND DH,0
MOV DX,SI ;SI存放'are'出现的末位置
SUB DL,3
ADD DL,30H ;显示位'are'的起始位置
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
2
DATA SEGMENT
BUFFER DB 'How are you',00H
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET BUFFER
LOP1: MOV BL,[SI]
CMP BL,20H
JNZ NEXT ;如果为逗号,将后面的数据前移
MOV DI,SI
LOP2: MOV BL,[DI+1]
MOV [DI],BL
INC DI
MOV BL,[DI]
CMP BL,0H ;如果为00,跳出内循环
JNZ LOP2
NEXT: INC SI
MOV BL,[SI]
CMP BL,0H ;如要[SI]小于为00H,跳出循环
JNZ LOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
3
DATA SEGMENT
BUF DB 60
N DB ?
CHAR DB 60 DUP(0)
STR DB 'INPUT NUM:','$'
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STR
MOV AH,9
INT 21H
MOV DX,OFFSET BUF
MOV AH,10
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
MOV CL,N
MOV SI,OFFSET CHAR
AND BH,0
MOV BL,N
ADD SI,BX
LOP1: DEC SI
MOV DL,[SI]
MOV AH,2
INT 21H
LOOP LOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
4
DATA SEGMENT
BUF DW 1234H,3456H,2134H,7893H,3456H
RESULT DW 0,0
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:CODE,SS:STACK,CS:CODE
START: MOV AX,DATA
MOV DS,AX
CALL PLUS_N
MOV SI,OFFSET RESULT
MOV BX,[SI+2]
CALL DISPLAY
MOV BX,[SI]
CALL DISPLAY
MOV AH,4CH
INT 21H
;功能:计算多字节相加
;入口参数:BUF
;出口参数:RESULT
PLUS_N PROC
AND DX,0
AND AX,0
MOV CL,5
MOV SI,OFFSET BUF
LOP: ADD AX,[SI]
ADC DX,0
INC SI
INC SI
LOOP LOP
MOV SI,OFFSET RESULT
MOV [SI],AX
MOV [SI+2],DX
RET
PLUS_N ENDP
;功能:显示十六进数
;入口参数:BX
DISPLAY PROC
MOV CH,4
LOP1: MOV CL,4
ROL BX,CL
MOV DL,BL
AND DL,0FH
ADD DL,30H
CMP DL,3AH
JB NEXT
ADD DL,7
NEXT: MOV AH,2
INT 21H
DEC CH
CMP CH,0
JNZ LOP1
RET
DISPLAY ENDP
CODE ENDS
END START
IBM-PC汇编语言程序设计练习题
第一大题的第六小题,一楼不肯定的题目的答案应该是外部符号
兄弟,你如果真的不懂,就算别人帮你做出来,你还是不懂啊,你还是自己先做,然后把不懂的发上来,问问大家吧
你要是能等的话,我明天把书本带上,慢慢帮你做。
看到这问题我们就知道:期末又到了~~~~-_,-
书上好多都有啊 只是代码编写要自己动下脑子
先做前两个大题吧
一:填空
1. AX又被称为(累加)器。
2. PF=1表示(低八位1的个数)为偶数。
3. 操作数直接存放在指令中,紧跟在操作码之后,他作为指令的一部分存放在代码段里,这种操作数称为(立即数)。
4. 62A0H+9D60H=(10000)H
5. 标号和变量都有三种属性:(1、段属性 2、偏移属性 3、类型属性)。
6. 在另一个模块中定义而要在本模块中使用的符号必须使用(段寻址)伪操作。(这题不肯定)
7. 逻辑运算是按(位)操作。
8. 循环程序通常由(初始化、循环工作与控制、循环结束的处理部分)三部分构成。
9. 129=(100000001)B
10. 机器数为88H,带符号十进制数(-120) 解题过程:88H即10001000B 第一个1表示是负数,而机器中的数都是以补码表示,补码又是原码变反加一,倒推一下,所以对应的正数是01111000,即120,所以~~
11. 将高级语言源程序翻译成机器语言程序的系统程序是(目标程序)。
12. (BP)称为基址指针寄存器。
13. 标识运算结果正负的标志是SF。SF=(1)时结果为正。
14. 8086实模式下一个段的大小可达(64K)B
15. 8086中可用于寄存器间接寻址的四个寄存器是(SP、BP、SI、DI)。
16. 在移位指令中,若移位次数大于1,就可将移位次数置于(CL寄存器)中。
17. 宏由(MACRO、ENDM)这一对伪指令来定义。
18. 访问堆栈的指令(如PUSH)只能使用(SS--堆栈段)作为段寄存器。
19. 指令CLD用于清除方向标志而(STD)指令使方向标志置1。
二。简答
根据以下要求,分别写出相应的汇编语言指令或指令序列。
1.把AX寄存器和BX寄存器的内容相减,结果存入AX中。
SBB AX,BX
2.将AX的内容逻辑左移5位。
MOV CL,5
SHL CL
3.将AX的内容,减去0520H和上次运算的借位。
SBB AX,0520H
4.将变量名TABLE的段地址送AX。
MOV AX,SEG TABLE
5.将DI的高四位置为0。
AND DI,0FH
6.输出一个字节到61H号端口。
OUT 61H,AL
7.将SI和DI的内容互换。
XCHG SI,DI
汇编语言程序设计习题
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不能用于内存寻址