编一汇编程序

在屏幕上显示如下图案:
* * * * * * *
* * * * *
* * *
*
其中第一行的“*”的个数由键盘输入数据指定(1~9),若输入的数据是偶数,则加1形成奇数。

第1个回答  2009-12-08
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:置光标位置
; 入口:DH=行坐标; DL=列坐标
SetCursor Proc Near
PUSH AX
MOV AH,2
INT 10H
POP AX
RET
SetCursor EndP
; -------------------------------------
; 功能:显示输出多个相同的字符
; 入口:AL=要显示的字符,CX=字符次数
Output_Chrs proc Near
push cx
push bx
push ax
xor bx,bx
mov ah,0ah
int 10h
pop ax
pop bx
pop cx
ret
Output_Chrs 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
; -------------------------------------
Prompt_Num db 'Please input a number(1-9):$'
Press_Key db 13,10,13,10,'Press any key to exit...$'
Start: push cs
pop ds
Output Prompt_Num
Input_Num: mov ah,1
int 21h
cmp al,'3'
jb Input_Num
cmp al,'9'
ja Input_Num
and al,0fh
call Output_CTLF ;输入一个回车、换行
call Output_CTLF
xor bx,bx
mov ah,3
int 10h
mov cl,al
xor ch,ch
test cx,1
jnz $+3
inc cx
mov al,'*'
Disp_Chrs: call SetCursor ;置光标位置
call Output_Chrs ;显示输出多个相同的字符
call Output_CTLF
cmp cx,1
jz Exit_Proc
inc dh
inc dl
dec cx
dec cx
jmp Disp_Chrs
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Score_Table: ;学生成绩存储区
Code ENDS
END Start ;编译到此结束
第2个回答  2009-12-08
dseg segment
tsh db 'please input (0~9):','$';提示
kge db ' ','$';两个空格
huanh db 0dh,0ah,'$';换行
dseg ends
sseg segment stack
db 8989 dup(?)
sseg ends
cseg segment
assume cs:cseg,ds:dseg,ss:sseg
start:
mov ax,dseg
mov ds,ax
xor ax,ax
mov dx,offset tsh
mov ah,09
int 21h

mov ah,01
int 21h
push ax
mov dx,offset huanh
mov ah,09
int 21h
pop ax
xor ah,ah
and al,0fh
push ax;*的个数

mov cl,02
div cl
test ah,0ffh
jz a1;判断余数奇偶,偶就跳转
pop ax
jmp a3
a1: pop ax
add ax,1;偶数加1
a3: mov cx,ax
mov bx,ax
push ax;第一次循环输入*的个数
inc bx
shr bx,1
mov si,bx;这是行数
a2:
mov dl,'*'
mov ah,02
int 21h
mov dl,' '
mov ah,02
int 21h

loop a2

pop cx;第一次循环输入*的个数
dec cx
dec cx
push cx
mov dx,offset huanh
mov ah,09
int 21h

dec bx
mov di,si
sub di,bx;
a4: mov dx,offset kge
mov ah,09
int 21h
dec di

jnz a4;和上一行的第di+1个对齐
test bx,0ffffh
jnz a2
mov dx,offset huanh
mov ah,09
int 21h

mov ah,4ch
int 21h
cseg ends
end start
第3个回答  2009-12-08
可运行,没用循环,因为如此一来可重用率大,代码没写注释,很通俗
masm5.0运行成功
data segment
disp0 db 0ah,0dh,'*********$'
disp1 db 0ah,0dh,' *******$'
disp2 db 0ah,0dh,' *****$'
disp3 db 0ah,0dh,' ***$'
disp4 db 0ah,0dh,' *$'
disp5 db 0ah,0dh,'please put a number again$'
disp6 db 0ah,0dh,'please put a number:$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
lea dx,disp6
mov ah, 9
int 21h
mov ah,1
int 21h
mov bl,al
mov bh,0
cmp bx,'1'
jb error
jz next1
cmp bx,'3'
jbe next3
cmp bx,'5'
jbe next5
cmp bx,'7'
jbe next7
cmp bx,'9'
ja error
lea dx, disp0
mov ah, 9
int 21h
next7:
lea dx,disp1
mov ah, 9
int 21h
next5:
lea dx,disp2
mov ah, 9
int 21h
next3:
lea dx,disp3
mov ah, 9
int 21h
next1:
lea dx,disp4
mov ah, 9
int 21h
jmp exit
error:
lea dx,disp5
mov ah,9
int 21h
exit:
mov ah, 4ch
int 21h
code ends
end start
第4个回答  2009-12-08
汇编语言也出这样的题目?!

你会什么语言呢,C会吗,PASCAL会吗,VB呢,随便会那一种都可以编写一个程序,编译为EXE,然后利用反汇编软件转换为汇编语言源程序既可。
第5个回答  2009-12-11

下列程序运行成功,可以满足要求。

DATA    SEGMENT PARA PUBLIC 'DATA'

    TIUI1 DB  'PLEASE INPUT A NUMBER(1-9):$'

    TIUI9 DB  13,10,7,'PRESS ANY KEY TO EXIT...$' 

DATA    ENDS

CODE    SEGMENT PARA PUBLIC 'CODE'

MAIN    PROC  FAR

        ASSUME  CS:CODE,  DS:DATA,  ES:DATA

START:  PUSH DS

        MOV AX,00H

        PUSH AX

        MOV AX,DATA

        MOV DS,AX

        MOV ES,AX

    LEA  DX, TIUI1

    MOV  AH, 9

    INT  21H

    MOV  AH, 1

    INT  21H

    CALL  CR_LF

    TEST  AL, 1

    JNZ   PPP

    INC   AL

PPP:

    CALL  CR_LF

    SUB   AL, 30H

    MOV   BH, 1

    MOV   BL, AL

    MOV   CX, BX

    INC   AL

X10:

    PUSH  AX

    MOV   BX, CX

    MOV   DL, ' '

    MOV   AH, 02H

X0:

    INT   21H

    SUB   BH, 1

    JNZ   X0

    MOV   DL, '*'

    MOV   AH, 02H

X1:

    INT   21H

    SUB   BL, 1

    JNZ   X1

    CALL  CR_LF

    INC   CH

    SUB   CL, 2

    POP   AX

    SUB   AL, 2

    JNZ   X10

E_MAIN: 

    LEA  DX, TIUI9

    MOV  AH, 9

    INT  21H

    MOV  AH, 1

    INT  21H

    MOV  AH, 4CH  ;结束程序 

    INT  21H

  MAIN    ENDP

CR_LF PROC NEAR

    PUSH  AX

    MOV   AH, 02H

    MOV   DL, 0DH

    INT   21H

    MOV   DL, 0AH

    INT   21H

    POP   AX

    RET

CR_LF  ENDP

CODE   ENDS

    END START

本回答被提问者采纳