1. 用DEBUG编写程序,在屏幕上显示一个字符串HELLO!,并以A.COM为文件名存盘
复制下面的文本内容,粘贴于记事本(注意:不要删除中间的空行),保存为A.TXT,然后在DOS提示符下输入:DEBUG
e10d 'HELLO!$'
a100
lea dx,[10d]
mov ah,9
int 21
mov ax,4c00
int 21
rbx
0
rcx
14
na.com
w100
q
-----------------------------------------
2. 编写完整汇编程序,将内存中10个有符号数求和。
; 下面的程序是16位汇编,编译通过,运行正确。
; Program Name: Adding.asm
Adding SEGMENT
ASSUME CS:Adding,DS:Adding
ORG 100H
Start: jmp Begin
Decimal DW 780,-370,266,48,-127,890,21,640,-1023,513 ; 10个有符号数
Deci_Sum DW ?
Begin: lea si,Decimal
cld
mov cx,9
lodsw
Adding0: add ax,[si]
inc si
inc si
loop Adding0
mov [si],ax
Exit_Proc: mov ax,4c00h ;结束程序
int 21h
Adding ENDS
END Start
-----------------------------------------
3. 编写完整程序将内存中一个无符号字节数以16进制的形式显示在屏幕上
; 下面的程序是16位汇编,编译通过,运行正确。
; Program Name: Hex_ASCII.asm
Hex_ASCII SEGMENT
ASSUME CS:Hex_ASCII,DS:Hex_ASCII
ORG 100H
Start: jmp Begin
DecimalNum db 76 ;无符号字节数
Change_Hex proc near
cmp al,9
ja Charactor
or al,30h
stosb
ret
Charactor: sub al,9
or al,40h
stosb
ret
Change_Hex endp
ChangeHex0 proc near
xor ah,ah
mov cl,4
shl ax,cl
shr al,cl
xchg ah,al
call Change_Hex
xchg ah,al
call Change_Hex
ret
ChangeHex0 endp
Begin: lea di,HeximalASC ;显示十六进制符号字符串地址
cld ;设置变址寄存器变址方向
mov al,DecimalNum
call ChangeHex0
mov al,'$'
stosb
lea dx,HeximalASC ;字符串首地址
mov ah,9 ; 显示结果
int 21h
Exit_Proc: mov ax,4c00h ;结束程序
int 21h
HeximalASC:
Hex_ASCII ENDS
END Start
-----------------------------------------
4. 编写完整汇编程序,统计内存中10个有符号数中正数的个数
; 下面的程序是16位汇编,编译通过,运行正确。
; Program Name: positive.asm
positive SEGMENT
ASSUME CS:positive,DS:positive
ORG 100H
Start: jmp Begin
Decimal DW 780,-370,266,48,-127,890,21,640,-1023,513 ; 10个有符号数
Deci_Sum DB ? ;正数的个数计数器
Begin: lea si,Decimal
cld
mov cx,10
mov Deci_Sum,0 ;计数器清零
positive0: lodsw
test ax,8000h
jz NextOne
inc Deci_Sum
NextOne: loop positive0
Exit_Proc: mov ax,4c00h ;结束程序
int 21h
positive ENDS
END Start
-----------------------------------------
5. 编写完整汇编程序,将内存中的5个无符号数从小到大排列
; Program Name: Bubbling.ASM
Bubbling SEGMENT
ASSUME CS:Bubbling,DS:Bubbling,ES:Bubbling
ORG 100H
Start: JMP Begin
Array DB -112,56,72,98,32 ;需要排序的数据
Elem_Num EQU ($-Array)/TYPE Array-1 ;外循环次数
Begin: MOV CX,Elem_Num
Scanning: PUSH CX ;入栈保存外循环次数
LEA SI,Array ;数组首地址装入源变址寄存器
Compare: PUSH SI
POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用
LODSB ;将当前数组元素读入累加器
CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较
JBE NextOne ;若小于或等于,不作数据交换,处理下一个数组元素
XCHG AL,[SI] ;若大于,交换数组元素
STOSB ;保存数值较小者
NextOne: LOOP Compare ;处理下一个数组元素
POP CX ;外循环次数出栈
LOOP Scanning ;下一趟比较
Exit_Proc:MOV AX,4C00H ;结束程序
INT 21H
Bubbling ENDS
END Start
-----------------------------------------
6.编写完整汇编语言程序,将内存中一个组合BCD数以十进制显示在屏幕上。
; 下面的程序是16位汇编,以组合BCD码58为例,编译通过,运行正确。
; Program Name: BCD_Code.asm
BCD_Code SEGMENT
ASSUME CS:BCD_Code,DS:BCD_Code
ORG 100H
Start: mov cl,4
mov al,BCD_Str
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov word ptr Dec_Str,ax
lea dx,Dec_Str ;字符串首地址
mov ah,9 ; 显示结果
int 21h
Exit_Proc:mov ax,4c00h ;结束程序
int 21h
BCD_Str db 58h
Dec_Str db ' $'
BCD_Code ENDS
END Start
我只答第一题,其它的太费事了,其实第1题也很费事的,呵呵。
进入debug(下面只给出输入内容,
A100
MOV DX,180
MOV AH,9
INT 21
MOV AH,4C
INT 21
F180 190 "HELLO!$"
G=100
N "A.ROM"
RBX
0
RCX
100
W100
Q
现在,你可以在dos提示符下直接看到A.ROM了,如果扩展名改成.COM,还可以直接执行的。
第1题应该是写错了。
1.用DEBUG编写程序,在屏幕上显示一个字符串HELLO!,并以A.cOM为文件名存盘,这倒好搞。
A.ROM存盘之后你怎么实现屏幕显示?
建议分开来问。