[求助]汇编题:按以下格式输出[00h,0FFh]范围内的 全部ASCII字符及16进制ASCII码
按以下格式输出范围内的全部ASCII字符及16进制ASCII码:
请问这个程序怎么写{:10_266:} 请问有大神教一下吗{:10_266:},今晚要交了{:10_266:},必有重谢{:10_266:} 看不懂中……话说,ASCII不是只有128个字符吗? 有扩展的ASCII码128个,就是最高位为1的。 这题好写呀.你定义一个字节变量,变量的内容就按照你图中的顺序出现就好了,比如爱心,在第4行第一列,03h(爱心的ASCII码),30h,33h(这两个是为了在屏幕上输出03) 宁馨儿小号 发表于 2018-11-20 21:15
这题好写呀.你定义一个字节变量,变量的内容就按照你图中的顺序出现就好了,比如爱心,在第4行第一列,03h( ...
但是想问一下怎么控制在屏幕上输出的位置{:10_266:},题目里面是怎么做到竖列输出的{:10_254:} TCY 发表于 2018-11-20 18:55
看不懂中……话说,ASCII不是只有128个字符吗?
我们老师没怎么教就让我们做这样的题 说超级简单{:10_266:} 这个程序真的要用汇编语言写吗?
人造人 发表于 2018-11-20 21:21
这个程序真的要用汇编语言写吗?
汇编课的作业{:10_285:} 寓捷 发表于 2018-11-20 21:25
汇编课的作业
好吧,我试试 人造人 发表于 2018-11-20 21:35
好吧,我试试
万分感谢{:10_254:} 我知道可能已经晚了,但是我写完了,那就贴出来吧
assume cs:code, ds:data
data segment
buffer db 512 dup(0)
stack db 512 dup(0)
stack_top:
data ends
code segment
; void PutChar(uint8_t x, uint8_t y, char ch, uint8_t attr);
PutChar:
push bp
mov bp, sp
push di
push es
mov ax, 0b800h
mov es, ax
mov dl, ; y
mov al, 160
mul dl
mov di, ax
mov dl, ; x
mov al, 2
mul dl
add di, ax
mov al, ; ch
mov ah, ; attr
mov es:, ax
mov bh, 0 ; 显示页码
mov dh, ; y
mov dl, ; x
add dl, 1
mov ah, 2 ; 设置光标位置
int 10h
pop es
pop di
mov sp, bp
pop bp
ret
; void PutString(uint8_t x, uint8_t y, char *str, uint8_t attr);
PutString:
push bp
mov bp, sp
push bx
push si
push di
mov si, ; x
mov di, ; y
mov bx, ; str
@@:
cmp byte ptr , 0
je @F
push ; attr
xor ah, ah
mov al,
push ax ; ch
push di ; y
push si ; x
call PutChar
add sp, 8
inc si
inc bx
jmp @B
@@:
pop di
pop si
pop bx
mov sp, bp
pop bp
ret
; void NumberToString(uint16_t number, char *buffer);
NumberToString:
push bp
mov bp, sp
push bx
push si
push di
mov di, ; buffer
mov ax, ; number
xor dx, dx
mov cx, 16
@@:
div cx
mov dh, dl
add dl, '0'
cmp dh, 10
jb @1
mov dl, dh
sub dl, 10
add dl, 'A'
@1:
mov , dl
inc di
xor dx, dx
cmp ax, 0
jne @B
mov byte ptr , 0 ; '\0'
; 下面翻转字符串
dec di
mov si, ; buffer
@@:
cmp si, di
jge @F
mov ah,
mov al,
mov , al
mov , ah
inc si
dec di
jmp @B
@@:
pop di
pop si
pop bx
mov sp, bp
pop bp
ret
; uint16_t strlen(char *str);
strlen:
push bp
mov bp, sp
push bx
mov bx, ; str
xor ax, ax
@@:
cmp byte ptr , 0
je @F
inc ax
inc bx
jmp @B
@@:
pop bx
mov sp, bp
pop bp
ret
; void strcpy(char *dest, char *src);
strcpy:
push bp
mov bp, sp
push si
push di
mov di, ; dest
mov si, ; src
@@:
mov al,
mov , al
inc si
inc di
cmp al, 0
jne @B
pop di
pop si
mov sp, bp
pop bp
ret
; 设置字符串长度为num个字符,如果字符串长度不够,在字符串前面添加字符'0'
; 如果字符串长度大于等于num个字符则什么也不做
; void FormatString(char *str, uint16_t num);
FormatString:
push bp
mov bp, sp
sub sp, 100
push bx
mov bx, ; str
push bx
call strlen
add sp, 2
cmp ax, ; num
jae FormatString_done
push ax ; 保存str的长度,之后要用
push bx
lea ax,
push ax
call strcpy
add sp, 4
mov cx, ; num
pop ax ; 在这里使用之前保存的str长度
sub cx, ax
@@:
mov byte ptr , '0'
inc bx
dec cx
cmp cx, 0
jne @B
lea ax,
push ax
push bx
call strcpy
add sp, 4
FormatString_done:
pop bx
mov sp, bp
pop bp
ret
; uint16_t getchar(void);
getchar:
push bp
mov bp, sp
mov ah, 0
int 16h
xor ah, ah
mov sp, bp
pop bp
ret
; void ClearScreen(void);
ClearScreen:
push bp
mov bp, sp
push di
push es
mov ax, 0b800h
mov es, ax
xor di, di
mov cx, 80 * 25
mov ax, 0720h
cld
rep stosw
pop es
pop di
mov sp, bp
pop bp
ret
start:
mov ax, data
mov ss, ax
mov sp, offset stack_top
mov ds, ax
call ClearScreen
xor bx, bx
xor si, si ; x
xor di, di ; y
@@:
cmp bx, 0FFh
ja @F
mov ax, 04h
push ax ; attr
push bx ; ch
push di ; y
mov ax, si
mov cl, 7 ; 每列7个字符对齐
mul cl
xor ah, ah
push ax ; x
call PutChar
add sp, 8
mov ax, offset buffer
push ax ; buffer
push bx ; number
call NumberToString
add sp, 4
mov ax, 2
push ax ; num
mov ax, offset buffer
push ax ; str
call FormatString
add sp, 4
mov ax, 02h
push ax ; attr
mov ax, offset buffer
push ax ; str
push di ; y
mov ax, si
mov cl, 7
mul cl
xor ah, ah
inc ax
push ax ; x
call PutString
add sp, 8
inc di
cmp di, 25 ; 每行25个字符
jb @1
inc si
xor di, di
@1:
inc bx
jmp @B
@@:
call getchar
mov ax, 4c00h
int 21h
code ends
end start
最后,附上C代码
#include <stdio.h>
#include <windows.h>
static void HideCursor(void)
{
CONSOLE_CURSOR_INFO cci = {100, FALSE};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
static void GotoXY(size_t x, size_t y)
{
COORD coord = {(SHORT)x, (SHORT)y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void PutChar(size_t x, size_t y, char ch, WORD color)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD NumberOfAttrsWritten;
GotoXY(x, y);
putchar(ch);
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
csbi.dwCursorPosition.X -= 1;
FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color, 1, csbi.dwCursorPosition, &NumberOfAttrsWritten);
}
int main(void)
{
const int WIDTH = 8;
const int HEIGHT = 25;
HideCursor();
int x = 0;
int y = 0;
for(int i = 0x00; i <= 0xFF; ++i)
{
PutChar(x * WIDTH, y, i, FOREGROUND_GREEN);
GotoXY(x * WIDTH + 1, y);
printf("%.2X", i);
++y;
if(y >= HEIGHT)
{
y = 0;
++x;
}
}
getchar();
return 0;
}
人造人 发表于 2018-11-23 17:13
谢谢!{:10_257:}请问一下这个怎么运行{:10_266:},我编译之后好像提示有error 寓捷 发表于 2018-11-23 20:05
谢谢!请问一下这个怎么运行,我编译之后好像提示有error
贴报错信息
人造人 发表于 2018-11-23 20:30
贴报错信息
{:10_254:} 寓捷 发表于 2018-11-23 21:29
用masm6.15
你现在的是5.10
本帖最后由 superbe 于 2018-11-24 17:24 编辑
编写实现了,感觉代码有一点麻烦,应该能更简炼,就先贴出来吧。
;显示Ascii码表
assume cs:code
code segment
start:
call clscreen ;清屏
mov ax,0 ;ascii码(0-255)
mov cx,256 ;256个字符
s0:
push ax
mov dl,25
div dl
mov dh,ah ;行号
mov dl,7 ;每列占7个字符宽度
mul dl
mov dl,al ;列号
pop ax
mov bl,00000100b
call showchar ;显示字符
push ax
call bytehex ;取得2位十六进制字符
push ax
mov al,ah
inc dl
mov bl,00000010b
call showchar ;显示十六进制高位字符
pop ax
inc dl
call showchar ;显示十六进制低位字符
pop ax
inc ax
loop s0
mov ah,1 ;功能号1 接收一个字符(按任意键继续)
int 21h
mov ax,4c00h
int 21h
;子程序clscreen
;功能:清屏
;参数:无
;返回:无
clscreen:
push ax
push di
push es
mov ax,0b800h
mov es,ax
mov di,0
mov cx,2000
s1: mov byte ptr es:,' '
add di,2
loop s1
pop es
pop di
pop ax
ret
;子程序bytehex
;功能:取得字节的2位十六进制字符
;参数:al=字节数据
;返回:ah=高位十六进制字符,al=低位十六进制字符
bytehex:
jmp short ok
table db '0123456789ABCDEF'
ok:
push bx
push es
push cx
mov ah,al
mov cl,4
shr ah,cl ;ah中为高4位
and al,00001111b ;al中为低4位
mov bl,ah
mov bh,0
mov ah,table ;查表取得高4位对应的十六进制字符
mov bl,al
mov bh,0
mov al,table ;查表取得低4位对应的十六进制字符
pop cx
pop es
pop bx
ret
;子程序showchar
;功能:在指定光标位置显示一个字符
;参数:dh=行号(0-24),dl=列号(0-79),al=字符ascii码,bl=颜色
;返回:无
showchar:
push ax
push bx
push cx
mov bh,0 ;第0页
mov cx,1 ;字符重复数
mov ah,2 ;功能号2 置光标
int 10h
mov ah,9 ;功能号9 显示字符
int 10h
pop cx
pop bx
pop ax
ret
code ends
end start 运行结果截图
人造人 发表于 2018-11-23 22:13
用masm6.15
你现在的是5.10
噢噢噢懂了{:10_266:},谢谢!
页:
[1]
2