寓捷 发表于 2018-11-20 15:03:21

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

按以下格式输出范围内的
全部ASCII字符及16进制ASCII码:
请问这个程序怎么写{:10_266:}

寓捷 发表于 2018-11-20 16:17:10

请问有大神教一下吗{:10_266:},今晚要交了{:10_266:},必有重谢{:10_266:}

TCY 发表于 2018-11-20 18:55:21

看不懂中……话说,ASCII不是只有128个字符吗?

宁馨儿小号 发表于 2018-11-20 21:09:49

有扩展的ASCII码128个,就是最高位为1的。

宁馨儿小号 发表于 2018-11-20 21:15:11

这题好写呀.你定义一个字节变量,变量的内容就按照你图中的顺序出现就好了,比如爱心,在第4行第一列,03h(爱心的ASCII码),30h,33h(这两个是为了在屏幕上输出03)

寓捷 发表于 2018-11-20 21:19:46

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

但是想问一下怎么控制在屏幕上输出的位置{:10_266:},题目里面是怎么做到竖列输出的{:10_254:}

寓捷 发表于 2018-11-20 21:20:24

TCY 发表于 2018-11-20 18:55
看不懂中……话说,ASCII不是只有128个字符吗?

我们老师没怎么教就让我们做这样的题 说超级简单{:10_266:}

人造人 发表于 2018-11-20 21:21:06

这个程序真的要用汇编语言写吗?

寓捷 发表于 2018-11-20 21:25:56

人造人 发表于 2018-11-20 21:21
这个程序真的要用汇编语言写吗?

汇编课的作业{:10_285:}

人造人 发表于 2018-11-20 21:35:04

寓捷 发表于 2018-11-20 21:25
汇编课的作业

好吧,我试试

寓捷 发表于 2018-11-20 21:38:31

人造人 发表于 2018-11-20 21:35
好吧,我试试

万分感谢{:10_254:}

人造人 发表于 2018-11-23 17:11:17

我知道可能已经晚了,但是我写完了,那就贴出来吧


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:48

寓捷 发表于 2018-11-23 20:05:36

人造人 发表于 2018-11-23 17:13


谢谢!{:10_257:}请问一下这个怎么运行{:10_266:},我编译之后好像提示有error

人造人 发表于 2018-11-23 20:30:37

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

贴报错信息

寓捷 发表于 2018-11-23 21:29:28

人造人 发表于 2018-11-23 20:30
贴报错信息

{:10_254:}

人造人 发表于 2018-11-23 22:13:04

寓捷 发表于 2018-11-23 21:29


用masm6.15
你现在的是5.10

superbe 发表于 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:,' '
        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

superbe 发表于 2018-11-24 15:58:06

运行结果截图

寓捷 发表于 2018-11-25 12:21:23

人造人 发表于 2018-11-23 22:13
用masm6.15
你现在的是5.10

噢噢噢懂了{:10_266:},谢谢!
页: [1] 2
查看完整版本: [求助]汇编题:按以下格式输出[00h,0FFh]范围内的 全部ASCII字符及16进制ASCII码