回 帖 发 新 帖 刷新版面

主题:这两个汇编程序对吗?怎么运行不起来的?

(1) 
1+2+3...+99+100=?结果显示出来。 

(2) 
输入3个数,比较大小,输出最大的数。 
上面两题怎么用汇编语言实现?

(1)
[size=6]data [/size]segment 
mun dw ? 
data ends 
code segment 
assume:cs:code,ds:data 
start:mov ax,data 
mov ds,ax 
mov ax,0h 
mov bx,64h 
rep: add ax,bx 
dec bx 
jnz rep 
mov [mun],ax 
mov bx,ax 
and bx,0f000h 
mov cx,04h 
call display 
mov bx,ax 
and bx,0f00h 
mov cx,08h 
call display 
mov bx,ax 
and bx,00f0h 
mov cx,0ch 
call display 
mov bx,ax 
and dx,000fh 
mov cx,10h 
call display 
mov ah,4ch 
int 21h 
display proc near 
rol bx,cx 
add bl,30h 
mov dl,bl 
mov ah,02h 
int 21h 
ret 
display endp 
code ends 
end start 

(2)
data segment 
daa db 3 dup (?) 
data ends 
code segment 
assume cs:code,ds:data 
start:mov ax,data 
mov ds,ax 
mov di,offset daa 
mov cx,3h 
rep: mov ah,01h 
int 21h 
mov [di],al 
inc di 
dec cx 
jnz rep 
mov di,offset daa 
mov al,[di] 
inc di 
cmp al,[di] 
jnb ne1 
mov a,[di] 
ne1: inc di 
cmp al,[di] 
jnb ne2 
mov al,[di] 
ne2: mov dl,al 
and dl,0f0h 
mov cx,04h 
rol dl,cx 
add dl,30h 
mov ah,02h 
int 21h 
mov dl,al 
and dl,0fh 
add dl,30h 
mov ah,02h 
int 21h 
code ends 
end start 

回复列表 (共3个回复)

沙发

;求1+2+3...+100=
;结果以十六进制输出
STACK   SEGMENT STACK
        DW  256 DUP(0)
STACK   ENDS
DATA    SEGMENT 
N       DB  64H
B       DB  2 DUP(0)
DATA    ENDS
CODE    SEGMENT 
        ASSUME  CS:CODE, DS:DATA, SS:STACK
START:  MOV   AX,DATA
        MOV   DS,AX
        MOV   AX,STACK
        MOV   SS,AX

        MOV   CL,N
R:      MOV   AL,B+1
 ADD   AL,CL
 MOV   B+1,AL
  MOV   AL,0
 ADC   AL,B
 MOV   B,AL
 LOOP  R

 MOV   AL,B
 CALL  ABC
 MOV   AL,B+1
 CALL  ABC
           
        MOV  AH,4CH
        INT  21H

ABC     PROC
        PUSH  AX
        PUSH  BX
        PUSH  CX
        PUSH  DX
        MOV CH,2
        MOV BL,AL
T:      MOV CL,4
        ROL BL,CL
        MOV DL,BL
        AND DL,0FH
        CMP DL,10
        JB  NEXT
        ADD DL,7
NEXT:   ADD DL,30H
        MOV AH,2
        INT 21H
        DEC CH
        JNZ T 
        POP  DX      
        POP  CX
        POP  BX
        POP  AX
        RET
ABC     ENDP
CODE    ENDS
        END  START 


板凳

这个是今天刚写的
;输入N个十六进制数,输出其中最大的
;每输完一个十六进制数,按回车,接着输入下一个
;输入非法十六进制数时,提示错误,重新输入

STACK SEGMENT STACK
 DB 256 DUP(0)
STACK   ENDS
DATA SEGMENT
N DW 5
STR DB 'ERROR,INPUT AGAIN:',0DH,0AH,'$'
DATA  ENDS
CODE SEGMENT
 ASSUME CS:CODE,DS:DATA
START:  MOV AX,DATA
 MOV DS,AX
 MOV CX,N
 MOV DX,0
L1:     CALL HDC
 CALL CRLF
 CMP  BX,0
 JNZ  L2
        LEA  DX,STR
 MOV  AH,9
 INT  21H
 JMP  L1
L2:     CMP  DX,BX
 JNL  L3  
        MOV  DX,BX
L3:     DEC  CX
 JNZ  L1
        
        MOV  BX,DX
 CALL CDH

 MOV  AH,4CH
 INT  21H

 
;BX中存放输入的十六进制数转换后得到的二进制数
HDC PROC
 PUSH AX
 PUSH CX
 MOV BX,0
NKEY: MOV AH,1
 INT 21H
 CMP AL,0DH
 JZ  EXIT
 CMP AL,30H
 JL  EXIT1
 CMP AL,3AH
 JL  DIGIT
 CMP AL,41H
 JL  EXIT1
 CMP AL,47H
 JL  CHAR
 CMP AL,61H
 JL  EXIT1
 CMP AL,67H
 JGE EXIT1
 SUB AL,20H
CHAR: SUB AL,7
DIGIT:  SUB AL,30H
 MOV CL,4
 SHL BX,CL
 MOV AH,0
 ADD BX,AX
 JMP NKEY
EXIT1:  MOV BX,0
EXIT: POP CX
 POP AX
        RET
HDC     ENDP

CRLF    PROC 
 PUSH AX
 PUSH DX
 MOV DL,0DH
 MOV AH,2
 INT 21H
 MOV DL,0AH
 MOV AH,2
 INT 21H
 POP DX
 POP AX
 RET
CRLF   ENDP

;BX中存放待输出二进制数,以十六进制形式输出
CDH     PROC
 PUSH DX
 PUSH CX
        PUSH AX
 MOV CX,4
T:      ROL BX,1
 ROL BX,1
 ROL BX,1
 ROL BX,1
 MOV DL,BL
 AND DL,0FH
        CMP DL,10
 JL  R
 ADD DL,7H
R: ADD DL,30H
 MOV AH,2
 INT 21H
 LOOP T
 POP AX
 POP CX
 POP DX
  RET
CDH     ENDP 
 
CODE  ENDS
 END START

3 楼

;求Y=1+2+3+4+5+6+……+100
;算法:顺序程序,用循环把初值放到一个寄存器里,把结果放到另一个,初值+1变什么之后与结果想+,
       当初值>100时退出


d1 segment
 y dw ?           ;定义(中间/最后)结果变量
d1 ends
stk degment
 db 100 dup(?)    ;定义堆栈段
stk ends
c1 segment
 assume cs:c1,ds:d1,ss:stk
main proc far
   push ds
   mov ax,0
   push ax           ;保护DOS现场
    mov ax,d1
    mov ds,ax          ;将数据段D地址送到DS
     mov ax,0
     mov bx,1       ;为AX和BX赋初值
   L:add ax,bx      
     inc bx
     cmp bx,100
   jbe L
   mov y,ax
   ret
  main endp
 c1 ends
end main

我来回复

您尚未登录,请登录后再回复。点此登录或注册