主题:求循环结构程序设计和分支结构程序设计的编程代码!!!
er72681085
[专家分:0] 发布于 2005-12-10 17:49:00
由于小弟刚学汇编不久,在学习的过程中遇到了困难啊,希望各位大哥大姐帮帮小弟我啊!题目如下:
(1).从键盘接受一字母,找出它在ASCⅡ码表中的前导字符与后续字符,并按照顺序输出这三个字符。(例如:输入C,则输出 BCD;输入z,则输出yza)
(2).从键盘上输入1—9之间的数,分别用转移表法和地址表法转向9个程序段,这9个程序段分别显示一个字符(A—I)。
(3).进制转换:十→十六;十→二;二→十;十六→十;十六→二
回复列表 (共12个回复)
沙发
erping [专家分:3660] 发布于 2005-12-10 21:18:00
;2005年12月10日18:16:20
;从键盘接受一字母,找出它在ASCII 码表中的前
;导字符与后续字符,并按照顺序输出这三个字符。
;(例如:输入C,则输出 BCD;输入z,则输出yza)
; 题目有问题
; 在 ASCII 码表中 'z' 后面不是 'a' 呀
.model small
disp_char macro c
mov dl, c
mov ah, 2
int 21H
endm
.stack
.data
.code
_main:
mov ah, 1
int 21H
dec al
mov bl, al
disp_char ' '
disp_char bl
inc bl
disp_char bl
inc bl
disp_char bl
mov ax, 4C00H
int 21H
end _main
板凳
erping [专家分:3660] 发布于 2005-12-10 21:18:00
;2005年12月10日 18:32:47
;从键盘上输入1—9之间的数,分别用转移表法和
;地址表法转向9个程序段,这9个程序段分别显
;示一个字符(A—I)。
;我其实真的不清楚什么是转移表法和地址表法
;只是自己理解写了一下,如果不对告诉我
;转移表法
.model small
disp_char macro c
mov dl, c
mov ah, 2
int 21H
endm
.stack
.code
_main:
mov ah, 1
int 21H
sub al, 31H
jb _exit ;是否小于 1
cmp al, 9
jg _exit ;是否大于 9
lea bx, _jump_table
xor ah, ah
shl ax, 1
add bx, ax
jmp bx
_jump_table:jmp _disp_A ;在这里每个跳转指令为 2 个字节
jmp _disp_B
jmp _disp_C
jmp _disp_D
jmp _disp_E
jmp _disp_F
jmp _disp_G
jmp _disp_H
jmp _disp_I
_disp_A:
disp_char 'A'
jmp _exit
_disp_B:
disp_char 'B'
jmp _exit
_disp_C:
disp_char 'C'
jmp _exit
_disp_D:
disp_char 'D'
jmp _exit
_disp_E:
disp_char 'E'
jmp _exit
_disp_F:
disp_char 'F'
jmp _exit
_disp_G:
disp_char 'G'
jmp _exit
_disp_H:
disp_char 'H'
jmp _exit
_disp_I:
disp_char 'I'
jmp _exit
_exit:
mov ax, 4C00H
int 21H
end _main
3 楼
erping [专家分:3660] 发布于 2005-12-10 21:18:00
;2005年12月10日 18:32:47
;从键盘上输入1—9之间的数,分别用转移表法和
;地址表法转向9个程序段,这9个程序段分别显
;示一个字符(A—I)。
;我其实真的不清楚什么是转移表法和地址表法
;只是自己理解写了一下,如果不对告诉我
;地址表法
.model small
disp_char macro c
mov dl, c
mov ah, 2
int 21H
endm
.stack
.data
address_table dw _disp_A, _disp_B, _disp_C,
_disp_D, _disp_E, _disp_F,
_disp_G, _disp_H, _disp_I
.code
_main:
mov ax, @data
mov ds, ax
mov ah, 1
int 21H
sub al, 31H
jb _exit ;是否小于 1
cmp al, 9
jg _exit ;是否大于 9
xor ah, ah
shl al, 1
mov bx, ax
jmp [bx + address_table]
_disp_A:
disp_char 'A'
jmp _exit
_disp_B:
disp_char 'B'
jmp _exit
_disp_C:
disp_char 'C'
jmp _exit
_disp_D:
disp_char 'D'
jmp _exit
_disp_E:
disp_char 'E'
jmp _exit
_disp_F:
disp_char 'F'
jmp _exit
_disp_G:
disp_char 'G'
jmp _exit
_disp_H:
disp_char 'H'
jmp _exit
_disp_I:
disp_char 'I'
jmp _exit
_exit:
mov ax, 4C00H
int 21H
end _main
4 楼
erping [专家分:3660] 发布于 2005-12-10 21:20:00
;2005年12月10日 19:04:52
;进制转换:十→十六;十→二;二→十;十六→十;十六→二
.model small
.stack
.data
pszDec db '100', 0
pszHex db 4 dup(?), 0
pszBin db 16 dup(?), 0
.code
_main:
mov ax, @data
mov ds, ax
mov es, ax
lea si, pszDec
lea di, pszHex
call DecStringToHexString
lea si, pszDec
lea di, pszBin
call DecStringtoBinString
mov ax, 4C00H
int 21H
;****************************************************
;DecStringToBin
;功能:
; 十进制字符串转换为机器数
;入口参数:
; SI 存放要转换的字符串的地址
;返回值:
; AX
;****************************************************
DecStringToBin proc
push bx
push cx
cld
xor ax, ax
xor bx, bx
mov cx, 10
_@DecStringToBin_1:
lodsb ;从 10 进制字符串中取出一个字节到 al, si 增一
sub al, 30H
jb _@DecStringToBin_2
cmp al, 9
ja _@DecStringToBin_2
push ax
push bx
pop ax
pop bx
mul cx
add bx, ax
jmp _@DecStringToBin_1
_@DecStringToBin_2:
mov ax, bx
pop cx
pop bx
ret
DecStringToBin endp
;****************************************************
;BinToDecString
;功能:
; 机器数转换为十进制字符串
;入口参数:
; AX 存放机器数
; SI 存放要转换后的字符串的地址
;****************************************************
BinToDecString proc
push dx
push cx
cld
mov cx, 10
_@BinToDecString_1:
xor dx, dx
div cx ;出以 10
push ax ;暂时保存商
mov al, dl
add al, '0' ;余数加 '0'
stosb
pop ax ;弹出商
test ax, ax
jnz _@BinToDecString_1
pop cx
pop bx
ret
BinToDecString endp
;未完...
5 楼
erping [专家分:3660] 发布于 2005-12-10 21:21:00
;****************************************************
;HexStringToBin
;功能:
; 16 进制字符串转换为机器数
;入口参数:
; SI 存放要转换的字符串的地址
;返回值:
; AX
;*****************************************************
HexStringToBin proc
push bx
push cx
cld
xor bx, bx ;最终转换的数暂存在 BX
xor ax, ax
mov cl, 4
_@HexStringToBin_1:
lodsb ;al = byte ptr ds:[si]
cmp al, '0'
jb _@HexStringToBin_4 ;al < 0 ?
cmp al, '9'
ja _@HexStringToBin_2 ;al <= 9 ?
sub al, '0'
jmp _@HexStringToBin_3
_@HexStringToBin_2:
or al, 'a' - 1 ;转换为小写
cmp al, 'a'
jb _@HexStringToBin_4
cmp al, 'f'
ja _@HexStringToBin_4
sub al, 'a'
_@HexStringToBin_3:
shl bx, cl
add bx, ax
jmp _@HexStringToBin_1
_@HexStringToBin_4:
mov ax, bx
pop cx
pop bx
ret
HexStringToBin endp
;****************************************************
;DecStringToHexString
;功能:
; 10 进制字符串转换为 16 进制的字符串
;入口参数:
; SI 存放要转换的字符串的地址
; DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;*****************************************************
DecStringToHexString proc
push bx
push cx
push dx
push si ;保存 SI
call DecStringToBin
pop si
mov bx, ax
cld
mov dx, 0F000H
mov cx, 12
_@DecToHex_3:
mov ax, bx
and ax, dx
shr ax, cl
add al, '0'
cmp al, '9'
jna _@DecToHex_4
add al, 8
_@DecToHex_4:
stosb
mov ch, cl
mov cl, 4
shr dx, cl
sub ch, 4
mov cl, ch
jns _@DecToHex_3
_ret_DecToHex:
pop dx
pop cx
pop bx
ret
DecStringToHexString endp
;未完。。。
6 楼
erping [专家分:3660] 发布于 2005-12-10 21:21:00
;**************************************************
;DecStringtoBinString
;功能:
; 10 进制字符串转换为 2 进制的字符串
;入口参数:
; SI 存放要转换的字符串的地址
; DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;**************************************************
DecStringtoBinString proc
push bx
push cx
push si
call DecStringToBin
pop si
mov bx, ax
mov cx, 16
_@DecStringtoBinString_0:
mov al, '0'
shl bx, 1
jnc _@DecStringtoBinString_1
inc al
_@DecStringtoBinString_1:
stosb
loop _@DecStringtoBinString_0
pop cx
pop bx
ret
DecStringtoBinString endp
;**************************************************
;BinStringToDecString
;功能:
; 2 进制字符串转换为 10 进制的字符串
;入口参数:
; SI 存放要转换的字符串的地址
; DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;**************************************************
BinStringToDecString proc
push bx
;先把 2 进制字符串转换为机器数, 存放在 bx 中
xor bx, bx
mov ah, 16
cld
_@BinStringToDecString_0:
lodsb
sub al, '0'
jb _@BinStringToDecString_3
cmp al, 1
ja _@BinStringToDecString_3
stc ;CF = 1
je _@BinStringToDecString_2 ;al == 1 ?
clc ;CF = 0
_@BinStringToDecString_2:
rcl bx, 1
dec ah
jnz _@BinStringToDecString_0
_@BinStringToDecString_3:
mov ax, bx
call BinToDecString
pop bx
ret
BinStringToDecString endp
;未完...
7 楼
erping [专家分:3660] 发布于 2005-12-10 21:21:00
;**************************************************
;HexStringToDecString
;功能:
; 16 进制字符串转换为 10 进制的字符串
;入口参数:
; SI 存放要转换的字符串的地址
; DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;**************************************************
HexStringToDecString proc
call HexStringToBin
mov si, di
call BinToDecString
ret
HexStringToDecString endp
;**************************************************
;HexStringToBinString
;功能:
; 16 进制字符串转换为 2 进制的字符串
;入口参数:
; SI 存放要转换的字符串的地址
; DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;**************************************************
HexStringToBinString proc
push bx
push cx
call HexStringToBin
mov bx, ax
cld
mov cx, 16
_@HexStringToDecString_0:
mov al, '0'
shl bx, 1
jnc _@HexStringToDecString_1
inc al
_@HexStringToDecString_1:
stosb
loop _@HexStringToDecString_0
pop cx
pop bx
ret
HexStringToBinString endp
end _main
;完
8 楼
erping [专家分:3660] 发布于 2005-12-10 21:23:00
注意第 3 问,有部分没有测试因为时间问题.
如果发现什么问题一定告诉我 ^_^
9 楼
er72681085 [专家分:0] 发布于 2005-12-10 21:51:00
非常感谢erping
这么快就回帖啦
10 楼
zhoul [专家分:260] 发布于 2005-12-11 19:22:00
厉害厉害,对我很有用,谢谢哈```
我来回复