鱼C论坛

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

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

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

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

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

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

使用道具 举报

 楼主| 发表于 2018-11-20 16:17:10 | 显示全部楼层
请问有大神教一下吗,今晚要交了,必有重谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 18:55:21 | 显示全部楼层
看不懂中……话说,ASCII不是只有128个字符吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:09:49 | 显示全部楼层
有扩展的ASCII码128个,就是最高位为1的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

但是想问一下怎么控制在屏幕上输出的位置,题目里面是怎么做到竖列输出的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我们老师没怎么教就让我们做这样的题 说超级简单
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:21:06 | 显示全部楼层
这个程序真的要用汇编语言写吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

汇编课的作业
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好吧,我试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

万分感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

1.png
  1. assume cs:code, ds:data

  2. data segment
  3. buffer        db 512 dup(0)
  4.        
  5. stack        db 512 dup(0)
  6. stack_top:
  7. data ends

  8. code segment
  9. ; void PutChar(uint8_t x, uint8_t y, char ch, uint8_t attr);
  10. PutChar:
  11.         push        bp
  12.         mov        bp, sp
  13.         push        di
  14.         push        es
  15.        
  16.         mov        ax, 0b800h
  17.         mov        es, ax
  18.         mov        dl, [bp + 6]        ; y
  19.         mov        al, 160
  20.         mul        dl
  21.         mov        di, ax
  22.         mov        dl, [bp + 4]        ; x
  23.         mov        al, 2
  24.         mul        dl
  25.         add        di, ax
  26.        
  27.         mov        al, [bp + 8]        ; ch
  28.         mov        ah, [bp + 10]        ; attr
  29.         mov        es:[di], ax
  30.        
  31.         mov        bh, 0        ; 显示页码
  32.         mov        dh, [bp + 6]        ; y
  33.         mov        dl, [bp + 4]        ; x
  34.         add        dl, 1
  35.         mov        ah, 2        ; 设置光标位置
  36.         int        10h
  37.        
  38.         pop        es
  39.         pop        di
  40.         mov        sp, bp
  41.         pop        bp
  42.         ret

  43. ; void PutString(uint8_t x, uint8_t y, char *str, uint8_t attr);
  44. PutString:
  45.         push        bp
  46.         mov        bp, sp
  47.         push        bx
  48.         push        si
  49.         push        di
  50.        
  51.         mov        si, [bp + 4]        ; x
  52.         mov        di, [bp + 6]        ; y
  53.         mov        bx, [bp + 8]        ; str
  54. @@:
  55.         cmp        byte ptr [bx], 0
  56.         je        @F
  57.         push        [bp + 10]        ; attr
  58.         xor        ah, ah
  59.         mov        al, [bx]
  60.         push        ax                ; ch
  61.         push        di                ; y
  62.         push        si                ; x
  63.         call        PutChar
  64.         add        sp, 8
  65.         inc        si
  66.         inc        bx
  67.         jmp        @B
  68. @@:
  69.         pop        di
  70.         pop        si
  71.         pop        bx
  72.         mov        sp, bp
  73.         pop        bp
  74.         ret

  75. ; void NumberToString(uint16_t number, char *buffer);
  76. NumberToString:
  77.         push        bp
  78.         mov        bp, sp
  79.         push        bx
  80.         push        si
  81.         push        di
  82.        
  83.         mov        di, [bp + 6]        ; buffer
  84.         mov        ax, [bp + 4]        ; number
  85.         xor        dx, dx
  86.         mov        cx, 16
  87. @@:
  88.         div        cx
  89.         mov        dh, dl
  90.         add        dl, '0'
  91.         cmp        dh, 10
  92.         jb        @1
  93.         mov        dl, dh
  94.         sub        dl, 10
  95.         add        dl, 'A'
  96. @1:
  97.         mov        [di], dl
  98.         inc        di
  99.         xor        dx, dx
  100.         cmp        ax, 0
  101.         jne        @B
  102.         mov        byte ptr [di], 0        ; '\0'
  103.        
  104.         ; 下面翻转字符串
  105.         dec        di
  106.         mov        si, [bp + 6]        ; buffer
  107. @@:
  108.         cmp        si, di
  109.         jge        @F
  110.         mov        ah, [si]
  111.         mov        al, [di]
  112.         mov        [si], al
  113.         mov        [di], ah
  114.         inc        si
  115.         dec        di
  116.         jmp        @B
  117. @@:
  118.         pop        di
  119.         pop        si
  120.         pop        bx
  121.         mov        sp, bp
  122.         pop        bp
  123.         ret

  124. ; uint16_t strlen(char *str);
  125. strlen:
  126.         push        bp
  127.         mov        bp, sp
  128.         push        bx
  129.        
  130.         mov        bx, [bp + 4]        ; str
  131.         xor        ax, ax
  132. @@:
  133.         cmp        byte ptr [bx], 0
  134.         je        @F
  135.         inc        ax
  136.         inc        bx
  137.         jmp        @B
  138. @@:
  139.         pop        bx
  140.         mov        sp, bp
  141.         pop        bp
  142.         ret

  143. ; void strcpy(char *dest, char *src);
  144. strcpy:
  145.         push        bp
  146.         mov        bp, sp
  147.         push        si
  148.         push        di
  149.        
  150.         mov        di, [bp + 4]        ; dest
  151.         mov        si, [bp + 6]        ; src
  152. @@:
  153.         mov        al, [si]
  154.         mov        [di], al
  155.         inc        si
  156.         inc        di
  157.         cmp        al, 0
  158.         jne        @B
  159.        
  160.         pop        di
  161.         pop        si
  162.         mov        sp, bp
  163.         pop        bp
  164.         ret

  165. ; 设置字符串长度为num个字符,如果字符串长度不够,在字符串前面添加字符'0'
  166. ; 如果字符串长度大于等于num个字符则什么也不做
  167. ; void FormatString(char *str, uint16_t num);
  168. FormatString:
  169.         push        bp
  170.         mov        bp, sp
  171.         sub        sp, 100
  172.         push        bx
  173.        
  174.         mov        bx, [bp + 4]        ; str
  175.         push        bx
  176.         call        strlen
  177.         add        sp, 2
  178.         cmp        ax, [bp + 6]        ; num
  179.         jae        FormatString_done
  180.         push        ax                ; 保存str的长度,之后要用
  181.        
  182.         push        bx
  183.         lea        ax, [bp - 100]
  184.         push        ax
  185.         call        strcpy
  186.         add        sp, 4
  187.        
  188.         mov        cx, [bp + 6]        ; num
  189.         pop        ax        ; 在这里使用之前保存的str长度
  190.         sub        cx, ax
  191. @@:
  192.         mov        byte ptr [bx], '0'
  193.         inc        bx
  194.         dec        cx
  195.         cmp        cx, 0
  196.         jne        @B
  197.        
  198.         lea        ax, [bp - 100]
  199.         push        ax
  200.         push        bx
  201.         call        strcpy
  202.         add        sp, 4
  203. FormatString_done:
  204.         pop        bx
  205.         mov        sp, bp
  206.         pop        bp
  207.         ret

  208. ; uint16_t getchar(void);
  209. getchar:
  210.         push        bp
  211.         mov        bp, sp
  212.        
  213.         mov        ah, 0
  214.         int        16h
  215.         xor        ah, ah
  216.        
  217.         mov        sp, bp
  218.         pop        bp
  219.         ret

  220. ; void        ClearScreen(void);
  221. ClearScreen:
  222.         push        bp
  223.         mov        bp, sp
  224.         push        di
  225.         push        es
  226.        
  227.         mov        ax, 0b800h
  228.         mov        es, ax
  229.         xor        di, di
  230.         mov        cx, 80 * 25
  231.         mov        ax, 0720h
  232.         cld
  233.         rep        stosw
  234.        
  235.         pop        es
  236.         pop        di
  237.         mov        sp, bp
  238.         pop        bp
  239.         ret

  240. start:
  241.         mov        ax, data
  242.         mov        ss, ax
  243.         mov        sp, offset stack_top
  244.         mov        ds, ax
  245.        
  246.         call        ClearScreen
  247.         xor        bx, bx
  248.         xor        si, si        ; x
  249.         xor        di, di        ; y
  250. @@:
  251.         cmp        bx, 0FFh
  252.         ja        @F
  253.         mov        ax, 04h
  254.         push        ax        ; attr
  255.         push        bx        ; ch
  256.         push        di        ; y
  257.         mov        ax, si
  258.         mov        cl, 7        ; 每列7个字符对齐
  259.         mul        cl
  260.         xor        ah, ah
  261.         push        ax        ; x
  262.         call        PutChar
  263.         add        sp, 8
  264.        
  265.         mov        ax, offset buffer
  266.         push        ax        ; buffer
  267.         push        bx        ; number
  268.         call        NumberToString
  269.         add        sp, 4
  270.        
  271.         mov        ax, 2
  272.         push        ax        ; num
  273.         mov        ax, offset buffer
  274.         push        ax        ; str
  275.         call        FormatString
  276.         add        sp, 4
  277.        
  278.         mov        ax, 02h
  279.         push        ax        ; attr
  280.         mov        ax, offset buffer
  281.         push        ax        ; str
  282.         push        di        ; y
  283.         mov        ax, si
  284.         mov        cl, 7
  285.         mul        cl
  286.         xor        ah, ah
  287.         inc        ax
  288.         push        ax        ; x
  289.         call        PutString
  290.         add        sp, 8
  291.        
  292.         inc        di
  293.         cmp        di, 25        ; 每行25个字符
  294.         jb        @1
  295.         inc        si
  296.         xor        di, di
  297. @1:
  298.         inc        bx
  299.         jmp        @B
  300. @@:
  301.         call        getchar
  302.         mov        ax, 4c00h
  303.         int        21h
  304. code ends
  305. end start
复制代码



最后,附上C代码
  1. #include <stdio.h>
  2. #include <windows.h>

  3. static void HideCursor(void)
  4. {
  5.         CONSOLE_CURSOR_INFO cci = {100, FALSE};
  6.         SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  7. }

  8. static void GotoXY(size_t x, size_t y)
  9. {
  10.         COORD coord = {(SHORT)x, (SHORT)y};
  11.         SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
  12. }

  13. void PutChar(size_t x, size_t y, char ch, WORD color)
  14. {
  15.         CONSOLE_SCREEN_BUFFER_INFO csbi;
  16.         DWORD NumberOfAttrsWritten;

  17.         GotoXY(x, y);
  18.         putchar(ch);
  19.         GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
  20.         csbi.dwCursorPosition.X -= 1;
  21.         FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color, 1, csbi.dwCursorPosition, &NumberOfAttrsWritten);
  22. }

  23. int main(void)
  24. {
  25.         const int WIDTH = 8;
  26.         const int HEIGHT = 25;

  27.         HideCursor();

  28.         int x = 0;
  29.         int y = 0;
  30.         for(int i = 0x00; i <= 0xFF; ++i)
  31.         {
  32.                 PutChar(x * WIDTH, y, i, FOREGROUND_GREEN);
  33.                 GotoXY(x * WIDTH + 1, y);
  34.                 printf("%.2X", i);
  35.                
  36.                 ++y;
  37.                 if(y >= HEIGHT)
  38.                 {
  39.                         y = 0;
  40.                         ++x;
  41.                 }
  42.         }

  43.         getchar();
  44.         return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-23 17:13:48 | 显示全部楼层
main.zip (1.45 KB, 下载次数: 4)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢!请问一下这个怎么运行,我编译之后好像提示有error
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

贴报错信息
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-23 21:29:28 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

用masm6.15
你现在的是5.10
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-24 15:50:46 | 显示全部楼层
本帖最后由 superbe 于 2018-11-24 17:24 编辑

编写实现了,感觉代码有一点麻烦,应该能更简炼,就先贴出来吧。

  1. ;显示Ascii码表
  2. assume cs:code

  3. code segment
  4. start:
  5.         call clscreen        ;清屏
  6.         mov ax,0        ;ascii码(0-255)
  7.         mov cx,256        ;256个字符
  8. s0:       
  9.         push ax
  10.         mov dl,25
  11.         div dl
  12.         mov dh,ah        ;行号
  13.         mov dl,7        ;每列占7个字符宽度
  14.         mul dl
  15.         mov dl,al        ;列号
  16.         pop ax
  17.         mov bl,00000100b
  18.         call showchar        ;显示字符
  19.         push ax
  20.         call bytehex        ;取得2位十六进制字符
  21.         push ax
  22.         mov al,ah
  23.         inc dl
  24.         mov bl,00000010b
  25.         call showchar        ;显示十六进制高位字符
  26.         pop ax
  27.         inc dl
  28.         call showchar        ;显示十六进制低位字符
  29.         pop ax
  30.         inc ax
  31.         loop s0
  32.        
  33.         mov ah,1        ;功能号1 接收一个字符(按任意键继续)
  34.         int 21h               
  35.         mov ax,4c00h
  36.         int 21h

  37. ;子程序clscreen
  38. ;功能:清屏
  39. ;参数:无
  40. ;返回:无
  41. clscreen:
  42.         push ax
  43.         push di
  44.         push es
  45.         mov ax,0b800h
  46.         mov es,ax
  47.         mov di,0
  48.         mov cx,2000
  49. s1:        mov byte ptr es:[di],' '
  50.         add di,2
  51.         loop s1
  52.         pop es
  53.         pop di
  54.         pop ax
  55.         ret
  56.        
  57. ;子程序bytehex
  58. ;功能:取得字节的2位十六进制字符
  59. ;参数:al=字节数据
  60. ;返回:ah=高位十六进制字符,al=低位十六进制字符
  61. bytehex:
  62.         jmp short ok
  63.         table db '0123456789ABCDEF'
  64. ok:
  65.         push bx
  66.         push es
  67.         push cx
  68.         mov ah,al
  69.         mov cl,4
  70.         shr ah,cl        ;ah中为高4位
  71.         and al,00001111b        ;al中为低4位
  72.         mov bl,ah
  73.         mov bh,0
  74.         mov ah,table[bx]        ;查表取得高4位对应的十六进制字符
  75.         mov bl,al
  76.         mov bh,0
  77.         mov al,table[bx]        ;查表取得低4位对应的十六进制字符
  78.         pop cx
  79.         pop es
  80.         pop bx
  81.         ret
  82.        
  83. ;子程序showchar
  84. ;功能:在指定光标位置显示一个字符
  85. ;参数:dh=行号(0-24),dl=列号(0-79),al=字符ascii码,bl=颜色
  86. ;返回:无
  87. showchar:
  88.         push ax
  89.         push bx
  90.         push cx
  91.         mov bh,0        ;第0页
  92.         mov cx,1        ;字符重复数
  93.         mov ah,2        ;功能号2 置光标
  94.         int 10h
  95.         mov ah,9        ;功能号9 显示字符
  96.         int 10h
  97.         pop cx
  98.         pop bx
  99.         pop ax
  100.         ret
  101.        
  102. code ends
  103. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-24 15:58:06 | 显示全部楼层
运行结果截图
无标题.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

噢噢噢懂了,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 05:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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