用汇编语言编写y={x(x<1); 2x-1(1<=x<10); 3x-11(x>=10),实现输入x值,输出y值.
2个回答
展开全部
;将X,Y均当作有符号数处理,若要当作无符号数处理还要简单些
CRLF macro ;实现回车换行的宏定义
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
endm
stack segment
dw 128 dup(0)
stack ends
code segmentstart:
call input_num ;输入x
cmp ax,1 ;根据x的值确定y的值放于BX中
jge next1
mov bx,ax
jmp disp_res
next1:cmp ax,10
jge next2
sal ax,1
sub ax,1
mov bx,ax
jmp disp_res
next2:mov bx,ax
sal ax,1
add bx,ax
sub bx,11
disp_res:CRLF ;回车换行
call disp_num ;显示放于BX中的y
mov ax, 4c00h .
int 21h
input_num proc ;输入-32768-32768之间的有符号数,通过AX返回
push bx
push cx
push dx
push si
mov cx,10
xor bx,bx
xor si,si
next_chr: mov ah,01h
int 21h
cmp al,0dh ;回车则结束
je ok
cmp al,'-'
jne is_dig ;是负数则将SI置1
mov si,1
jmp next_chr
is_dig:
cmp al,'0'
jb no_dig
cmp al,'9'
ja no_dig
and al,0fh
xor ah,ah
xchg bx,ax
mul cx
add bx,ax
jmp next_chr
no_dig: ;非数字则自动将其删除
mov ah,02h
mov dl,08h ;退格键
int 21h
mov dl,' '
int 21h
jmp next_chr
ok: mov ax,bx
cmp si,1
jne disp_ret
neg ax
disp_ret:
pop si
pop dx
pop cx
pop bx
ret
input_num endp
disp_num proc ;以十进制数形式显示来自BX中的16位有符号数
push ax
push cx
push dx
mov ax,bx
mov bx,10
xor cx,cx
xor si,si
cmp ax,0
je disp_0 ;为0则转
jg disp_next ;正数则转
neg ax ;是负数,则取其绝对值并显示'-'
push ax
mov dl,'-'
mov ah,02h
int 21h
pop ax
disp_next:
xor dx,dx ;依次分离待转换数的个十百千万位并转换成ASCII码后放入堆栈
div bx
or dl,30h
push dx
inc cx
cmp ax,0
jne disp_next
disp_asc:
mov ah,02h ;以十进制数字显示
pop dx
int 21h
loop disp_asc
jmp disp_ok
disp_0:
mov ah,02h ;待显示数为0时显示0
mov dl,'0'
int 21h
disp_ok:
pop dx
pop cx
pop ax
ret
disp_num endp
code ends
end start
CRLF macro ;实现回车换行的宏定义
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
endm
stack segment
dw 128 dup(0)
stack ends
code segmentstart:
call input_num ;输入x
cmp ax,1 ;根据x的值确定y的值放于BX中
jge next1
mov bx,ax
jmp disp_res
next1:cmp ax,10
jge next2
sal ax,1
sub ax,1
mov bx,ax
jmp disp_res
next2:mov bx,ax
sal ax,1
add bx,ax
sub bx,11
disp_res:CRLF ;回车换行
call disp_num ;显示放于BX中的y
mov ax, 4c00h .
int 21h
input_num proc ;输入-32768-32768之间的有符号数,通过AX返回
push bx
push cx
push dx
push si
mov cx,10
xor bx,bx
xor si,si
next_chr: mov ah,01h
int 21h
cmp al,0dh ;回车则结束
je ok
cmp al,'-'
jne is_dig ;是负数则将SI置1
mov si,1
jmp next_chr
is_dig:
cmp al,'0'
jb no_dig
cmp al,'9'
ja no_dig
and al,0fh
xor ah,ah
xchg bx,ax
mul cx
add bx,ax
jmp next_chr
no_dig: ;非数字则自动将其删除
mov ah,02h
mov dl,08h ;退格键
int 21h
mov dl,' '
int 21h
jmp next_chr
ok: mov ax,bx
cmp si,1
jne disp_ret
neg ax
disp_ret:
pop si
pop dx
pop cx
pop bx
ret
input_num endp
disp_num proc ;以十进制数形式显示来自BX中的16位有符号数
push ax
push cx
push dx
mov ax,bx
mov bx,10
xor cx,cx
xor si,si
cmp ax,0
je disp_0 ;为0则转
jg disp_next ;正数则转
neg ax ;是负数,则取其绝对值并显示'-'
push ax
mov dl,'-'
mov ah,02h
int 21h
pop ax
disp_next:
xor dx,dx ;依次分离待转换数的个十百千万位并转换成ASCII码后放入堆栈
div bx
or dl,30h
push dx
inc cx
cmp ax,0
jne disp_next
disp_asc:
mov ah,02h ;以十进制数字显示
pop dx
int 21h
loop disp_asc
jmp disp_ok
disp_0:
mov ah,02h ;待显示数为0时显示0
mov dl,'0'
int 21h
disp_ok:
pop dx
pop cx
pop ax
ret
disp_num endp
code ends
end start
展开全部
;----------------------------------------------
;从键盘输入 x (0 ~ 65535),以回车结束
;求 y,将结果在屏幕上显示出来。
;----------------------------------------------
DISP_STR MACRO X ;宏定义
MOV DX, OFFSET X
MOV AH, 9
INT 21H
ENDM
;----------------------------------------------
DATA SEGMENT ;数据段.
MSG0 DB 'y = x (x < 1)', 13, 10
DB 'y = 2x - 1 (1 <= x < 10)', 13, 10
DB 'y = 3x - 11 (x >= 10)', 13, 10
MSG1 DB 13, 10, 'Input x(0 ~ 65535): $'
MSG2 DB 13, 10, 'I can not count so much ! $'
MSG3 DB 13, 10, 'The y is : $'
x DW ? ;存放输入数据.
y DW ? ;
DATA ENDS
;----------------------------------------------
CODE SEGMENT ;代码段.
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
;--------------------------------
DISP_STR MSG0 ;宏调用,提示 Please Input :
MOV y, 0 ;和 清零.
;--------------------------------
IN_LOOP:
MOV x, 0 ;数据清零.
_INX:
MOV AH, 1 ;输入字符.
INT 21H
CMP AL, 13 ;回车?
JZ _Y ;全部数字结束.
CMP AL, 30H
JB _IN_ERR ;小于'0',输入错误.
CMP AL, 3AH
JNB _IN_ERR ;大于'9',输入错误.
;--------------------------------
SUB AL, 30H
MOV AH, 0
MOV CX, AX
MOV AX, x
MOV BX, 10 ;老数据乘以10
MUL BX
AND DX, DX
JNZ _IN_ERR ;输入过大,错误.
ADD AX, CX ;加上新数据.
JC _IN_ERR
MOV x, AX ;保存.
JMP _INX ;继续输入.
;--------------------------------
_Y:
MOV AX, x ;完整的数据.
CMP AX, 0 ;= 0 ?
JNE DY0
MOV y, AX ;保存.
JMP _END
DY0:
CMP AX, 10
JNB DY10
ADD AX, AX
JC _IN_ERR
SUB AX, 1
MOV y, AX ;保存.
JMP _END
DY10:
MOV BX, AX
ADD AX, BX
JC _IN_ERR
ADD AX, BX
JC _IN_ERR
SUB AX, 11
MOV y, AX ;保存.
;--------------------------------
_END:
DISP_STR MSG3 ;宏调用,提示 The y is :
MOV AX, y
CALL PRINTAX ;显示
JMP EXIT
;--------------------------------
_IN_ERR:
DISP_STR MSG2 ;宏调用,提示 can not count so much !
EXIT:
MOV AH, 4CH
INT 21H
;--------------------------------
PRINTAX PROC
MOV BX, 10
OR AX, AX
JZ _0_
LOOP_P:
XOR DX, DX
DIV BX
MOV CX, AX ;商.
OR CX, DX
JZ _E_
PUSH DX
CALL LOOP_P ;递归.
POP DX
ADD DL, '0'
JMP _1_
_0_:MOV DL, '0'
_1_:MOV AH, 2
INT 21H
_E_:RET
PRINTAX ENDP
;------------------------------
CODE ENDS
END START
;==============================================
;从键盘输入 x (0 ~ 65535),以回车结束
;求 y,将结果在屏幕上显示出来。
;----------------------------------------------
DISP_STR MACRO X ;宏定义
MOV DX, OFFSET X
MOV AH, 9
INT 21H
ENDM
;----------------------------------------------
DATA SEGMENT ;数据段.
MSG0 DB 'y = x (x < 1)', 13, 10
DB 'y = 2x - 1 (1 <= x < 10)', 13, 10
DB 'y = 3x - 11 (x >= 10)', 13, 10
MSG1 DB 13, 10, 'Input x(0 ~ 65535): $'
MSG2 DB 13, 10, 'I can not count so much ! $'
MSG3 DB 13, 10, 'The y is : $'
x DW ? ;存放输入数据.
y DW ? ;
DATA ENDS
;----------------------------------------------
CODE SEGMENT ;代码段.
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
;--------------------------------
DISP_STR MSG0 ;宏调用,提示 Please Input :
MOV y, 0 ;和 清零.
;--------------------------------
IN_LOOP:
MOV x, 0 ;数据清零.
_INX:
MOV AH, 1 ;输入字符.
INT 21H
CMP AL, 13 ;回车?
JZ _Y ;全部数字结束.
CMP AL, 30H
JB _IN_ERR ;小于'0',输入错误.
CMP AL, 3AH
JNB _IN_ERR ;大于'9',输入错误.
;--------------------------------
SUB AL, 30H
MOV AH, 0
MOV CX, AX
MOV AX, x
MOV BX, 10 ;老数据乘以10
MUL BX
AND DX, DX
JNZ _IN_ERR ;输入过大,错误.
ADD AX, CX ;加上新数据.
JC _IN_ERR
MOV x, AX ;保存.
JMP _INX ;继续输入.
;--------------------------------
_Y:
MOV AX, x ;完整的数据.
CMP AX, 0 ;= 0 ?
JNE DY0
MOV y, AX ;保存.
JMP _END
DY0:
CMP AX, 10
JNB DY10
ADD AX, AX
JC _IN_ERR
SUB AX, 1
MOV y, AX ;保存.
JMP _END
DY10:
MOV BX, AX
ADD AX, BX
JC _IN_ERR
ADD AX, BX
JC _IN_ERR
SUB AX, 11
MOV y, AX ;保存.
;--------------------------------
_END:
DISP_STR MSG3 ;宏调用,提示 The y is :
MOV AX, y
CALL PRINTAX ;显示
JMP EXIT
;--------------------------------
_IN_ERR:
DISP_STR MSG2 ;宏调用,提示 can not count so much !
EXIT:
MOV AH, 4CH
INT 21H
;--------------------------------
PRINTAX PROC
MOV BX, 10
OR AX, AX
JZ _0_
LOOP_P:
XOR DX, DX
DIV BX
MOV CX, AX ;商.
OR CX, DX
JZ _E_
PUSH DX
CALL LOOP_P ;递归.
POP DX
ADD DL, '0'
JMP _1_
_0_:MOV DL, '0'
_1_:MOV AH, 2
INT 21H
_E_:RET
PRINTAX ENDP
;------------------------------
CODE ENDS
END START
;==============================================
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询