鱼C论坛

 找回密码
 立即注册
查看: 5617|回复: 21

[求助]汇编题:按以下格式输出[00h,0FFh]范围内的 全部ASCII字符及16进制ASCII码

[复制链接]
发表于 2018-11-20 15:03:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
按以下格式输出[00h,0FFh]范围内的
全部ASCII字符及16进制ASCII码:
请问这个程序怎么写
ascii.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-11-20 16:17:10 | 显示全部楼层
请问有大神教一下吗,今晚要交了,必有重谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 18:55:21 | 显示全部楼层
看不懂中……话说,ASCII不是只有128个字符吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:09:49 | 显示全部楼层
有扩展的ASCII码128个,就是最高位为1的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:15:11 | 显示全部楼层
这题好写呀.你定义一个字节变量,变量的内容就按照你图中的顺序出现就好了,比如爱心,在第4行第一列,03h(爱心的ASCII码),30h,33h(这两个是为了在屏幕上输出03)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-20 21:19:46 | 显示全部楼层
宁馨儿小号 发表于 2018-11-20 21:15
这题好写呀.你定义一个字节变量,变量的内容就按照你图中的顺序出现就好了,比如爱心,在第4行第一列,03h( ...

但是想问一下怎么控制在屏幕上输出的位置,题目里面是怎么做到竖列输出的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-20 21:20:24 | 显示全部楼层
TCY 发表于 2018-11-20 18:55
看不懂中……话说,ASCII不是只有128个字符吗?

我们老师没怎么教就让我们做这样的题 说超级简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:21:06 | 显示全部楼层
这个程序真的要用汇编语言写吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-20 21:25:56 | 显示全部楼层
人造人 发表于 2018-11-20 21:21
这个程序真的要用汇编语言写吗?

汇编课的作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:35:04 | 显示全部楼层

好吧,我试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-20 21:38:31 | 显示全部楼层

万分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-23 17:11:17 | 显示全部楼层
我知道可能已经晚了,但是我写完了,那就贴出来吧

1.png
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, [bp + 6]        ; y
        mov        al, 160
        mul        dl
        mov        di, ax
        mov        dl, [bp + 4]        ; x
        mov        al, 2
        mul        dl
        add        di, ax
        
        mov        al, [bp + 8]        ; ch
        mov        ah, [bp + 10]        ; attr
        mov        es:[di], ax
        
        mov        bh, 0        ; 显示页码
        mov        dh, [bp + 6]        ; y
        mov        dl, [bp + 4]        ; 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, [bp + 4]        ; x
        mov        di, [bp + 6]        ; y
        mov        bx, [bp + 8]        ; str
@@:
        cmp        byte ptr [bx], 0
        je        @F
        push        [bp + 10]        ; attr
        xor        ah, ah
        mov        al, [bx]
        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, [bp + 6]        ; buffer
        mov        ax, [bp + 4]        ; 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        [di], dl
        inc        di
        xor        dx, dx
        cmp        ax, 0
        jne        @B
        mov        byte ptr [di], 0        ; '\0'
        
        ; 下面翻转字符串
        dec        di
        mov        si, [bp + 6]        ; buffer
@@:
        cmp        si, di
        jge        @F
        mov        ah, [si]
        mov        al, [di]
        mov        [si], al
        mov        [di], 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, [bp + 4]        ; str
        xor        ax, ax
@@:
        cmp        byte ptr [bx], 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, [bp + 4]        ; dest
        mov        si, [bp + 6]        ; src
@@:
        mov        al, [si]
        mov        [di], 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, [bp + 4]        ; str
        push        bx
        call        strlen
        add        sp, 2
        cmp        ax, [bp + 6]        ; num
        jae        FormatString_done
        push        ax                ; 保存str的长度,之后要用
        
        push        bx
        lea        ax, [bp - 100]
        push        ax
        call        strcpy
        add        sp, 4
        
        mov        cx, [bp + 6]        ; num
        pop        ax        ; 在这里使用之前保存的str长度
        sub        cx, ax
@@:
        mov        byte ptr [bx], '0'
        inc        bx
        dec        cx
        cmp        cx, 0
        jne        @B
        
        lea        ax, [bp - 100]
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-23 17:13:48 | 显示全部楼层
main.zip (1.45 KB, 下载次数: 4)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-23 20:05:36 | 显示全部楼层

谢谢!请问一下这个怎么运行,我编译之后好像提示有error
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-23 20:30:37 | 显示全部楼层
寓捷 发表于 2018-11-23 20:05
谢谢!请问一下这个怎么运行,我编译之后好像提示有error

贴报错信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-23 21:29:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-23 22:13:04 | 显示全部楼层

用masm6.15
你现在的是5.10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-24 15:50:46 | 显示全部楼层
本帖最后由 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:[di],' '
        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[bx]        ;查表取得高4位对应的十六进制字符
        mov bl,al
        mov bh,0
        mov al,table[bx]        ;查表取得低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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-24 15:58:06 | 显示全部楼层
运行结果截图
无标题.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-25 12:21:23 | 显示全部楼层
人造人 发表于 2018-11-23 22:13
用masm6.15
你现在的是5.10

噢噢噢懂了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-5 19:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表