标签:运行 数值转换 bsp span 使用 偏移地址 png 利用 寻址方式
补全程序 t1.asm,完成在屏幕上输出内存单元中的十进制两位数
; 在屏幕上输出内存单元中的十进制两位数感觉就是取模() assume cs:code, ds:data data segment db 12 ;小于65565可以用ax寄存器存。一般都是以是16个字节为单位分配 db 0,0 ;前一个字节用于保存商,后一个字节用于保存余数 data ends code segment start: mov ax,data mov ds,ax ; 补全指令,使得ds <-- data段地址 mov ah,0; mov al,ds:[0] ; ax <-- data段字节单元的被除数12;书上提到16位被除数默认于AX中 mov bl,10 div bl ;(ax)/(bl) mov ds:[1h],al ; 补全代码,让商保存到data段注释中指定的单元 mov ds:[2h],ah ; 补全代码,让余数保存到data段注释中指定的单元 mov ah,2 mov dl,ds:[1] ; 补全代码,使得dl <-- data段中保存的商的字节单元数值 mov al,dl or al,30h mov dl,al int 21h; 补全代码,使得dl中的数值转换为数字字符(1)从内存单元中取出完成 mov ah,2 mov dl,ds:[2] ; 补全代码,使得dl <-- data段中保存余数的字节单元数值 mov al ,dl or al,30h mov dl,al ; 补全代码,使得dl中的数值转换为数字字符 int 21h mov ax,4c00h int 21h code ends end start
这里我把内存单元中的值放在寄存器中进行转换。
补全程序 t2.asm,完成在屏幕上输出 data 段定义的 5 个十进制两位数,数据和数据 之间以空格间隔。
assume cs:code, ds:data data segment db 12,35,96,55,67 data ends code segment start: ; 补全程序,参考t1.asm,综合应用以下知识完成: ; (1) loop指令、内存单元地址的灵活表示 ; (2) div指令, 数字→数字字符的转换 ; (3) int 21h的2号子功能,完成单个字符输出的方法,即: ; mov ah,2 ; mov dl,待输出字符或其ASCⅡ码 ; int 21h ; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符 mov ax,data mov ds,ax mov si,0;偏移地址 mov cx,5 mov bl,10;除数 s: mov ah,0 mov al,ds:[si] div bl or al,30h;商 mov dl,al; mov ah,2 int 21h mov ah,0 mov al,ds:[si] div bl or ah,30h mov dl,ah mov ah,2 int 21h mov dl,‘ ‘ mov ah,2 int 21h inc si loop s mov ax,4c00h int 21h code ends end start
冲突:调用库函数向屏幕输入字符需要向ah传入2 ,与div保存结果的ah冲突最终导致数据覆盖。我进行了两次运算。这显然不符合代码要求的精简。
try again:利用内存单元存储
assume cs:code, ds:data data segment db 12,35,96,55,67 data ends code segment start: ; 补全程序,参考t1.asm,综合应用以下知识完成: ; (1) loop指令、内存单元地址的灵活表示 ; (2) div指令, 数字→数字字符的转换 ; (3) int 21h的2号子功能,完成单个字符输出的方法,即: ; mov ah,2 ; mov dl,待输出字符或其ASCⅡ码 ; int 21h ; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符 mov ax,data mov ds,ax mov si,0;偏移地址 mov cx,5 mov bl,10;除数 s: mov ah,0 mov al,ds:[si] div bl or al,30h or ah,30h mov ds:[si+5],al mov ds:[si+5+1],ah mov dl,ds:[si+5] mov ah,2 int 21h mov dl,ds:[si+5+1] mov ah,2 int 21h mov dl,‘ ‘ mov ah,2 int 21h inc si loop s mov ax,4c00h int 21h code ends end start
但是我想知道这两者哪个更快些,以及更精简的方法。
任务三:
题目如下:
; p187 实验9 assume ds:data, cs:code data segment db ‘welcome to masm!‘ db 2H,24H,71H ;字符串属性值 data ends code segment start: mov ax,data mov ds,ax ;字符串及属性值所在段的段地址送入ds mov ax,0b800H mov es,ax ;80×25彩色字符模式显示缓冲区段地址送入es ; 添加代码,通过循环逐个将每个字符及其属性送入相应的显示缓冲区对应行 ; 即:将data段的字符及属性通过循环逐个mov到显示缓冲区(es)段相应的单元内 ; 可以先尝试分别写三段代码,每次完成一行的显示 ; 程序运行起来后,再尝试通过灵活的寻址方式和循环,对三段代码修改和简化 ; 学习第10章子程序后,还可以进一步完善优化,设计子程序,将行号、列号、颜色属性设置成入口参数 mov cx,7;>=7 都是字母变色 mov si,0 mov di,0 s:mov al,ds:[si] mov es:[di],al inc di mov al,2 mov es:[di],al inc si inc di;the even stores the value loop s mov cx,2 inc si add di,2 s1: mov al,ds:[si] mov es:[di],al inc di mov al,24H mov es:[di],al inc di inc si loop s1 mov cx,5 inc si add di,2 s2: mov al,ds:[si] mov es:[di],al inc di mov al,71h mov es:[di],al inc di inc si loop s2 mov ax,4c00h int 21h code ends end start
人为以空格为分隔点,分成三个字符串段。并在读取完成之后手动增加空格所占位移。
一些规则
数字转化为字符 or AL, 00110000B 或者 or AL,30H 或者 and al ,30H
大写转成小写字母 or al,00100000b 或者 or al,20H 或者 and al,odfh(=ffh-20h) 或者sub al,20h
标签:运行 数值转换 bsp span 使用 偏移地址 png 利用 寻址方式
原文地址:https://www.cnblogs.com/hongjie-di/p/10097537.html