标签:格式 指示 开始 jmp 执行 包含 中间 一个 调用函数
教材「实验9 根据材料编程」(P187-189)
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm!‘。
程序正确编写后,预期输出结果如下:
assume cs:code
data segment
db ‘welcome to masm!‘
db 2,36,113
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b86eH
mov es,ax
mov bx,0
mov cx,3
s1: push cx
mov cx,16
mov si,0
mov di,64
s: mov al,[si]
mov es:[di],al
mov al,[16+bx]
mov es:[di+1],al
inc si
add di,2
loop s
inc bx
mov ax,es
add ax,0ah
mov es,ax
pop cx
loop s1
mov ax,4c00h
int 21h
code ends
end start
2,36,113
(10进制)0b86eh
,并将其赋值给额外数据段esmov bx,0
用bx标记当前输出行数mov cx,0
需要输出三行,因此外层循环为3次loop指令
因此将当前cx压入栈,并标记为s1mov di,64
,并将字符赋值到es:[di]
[16+bx]
,将其赋值到es:[di+1]
pop cx
进入下一循环编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。子程序printSar
功能:以指定颜色在屏幕上(从屏幕左上角开始)输出字符串
要求:字符串以0结尾
入口参数
字符串的起始地址—> ds: si (其中,字符串所在段的段地址—> ds, 字符串起始地址
的偏移地址—> si
字符串颜色—> al
出口参数:无
assume cs:code, ds:data
data segment
str db ‘another try‘, 0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, offset str
mov al, 4
call printStr
mov ah, 4ch
int 21h
printStr:
push bx
push cx
push si
push di
mov bx, 0b800H
mov es, bx
mov di, 0
s: mov cl, [si]
mov ch, 0
jcxz over
mov ch, al
mov es:[di], cx
inc si
add di, 2
jmp s
over: pop di
pop si
pop cx
pop bx
ret
code ends
end start
mov si,offset str
使用offset
指令,计算字符串的偏移量mov al,2
mov al,4
2、4分别为绿字和红字的颜色属性call printStr
即跳转至printStr
处使用任意文本编辑器,录入汇编源程序task3.asm。
子程序num2str:
功能:把0~2559之间的任意整数转换成数字字符串,例如,把1984转换成‘1984‘
入口参数
要转换的整数 —> ax
数字字符串的起始地址 —> ds:di (其中:数字字符串所在段的段地址—> ds,字符串
起始地址的偏移地址—>di)
出口参数:无
assume cs:code, ds:data
data segment
x dw 1984
str db 16 dup(0)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, x
mov di, offset str
call num2str
mov ah, 4ch
int 21h
num2str:
push ax
push bx
push cx
push dx
mov cx, 0
mov bl, 10
s1:
div bl
inc cx
mov dl, ah
push dx
mov ah, 0
cmp al, 0
jne s1
s2:
pop dx
or dl, 30h
mov [di], dl
inc di
loop s2
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
div bl
div指令将除数存储在bl中,被除数在ax中(11行赋值),结果商在al中,余数在ahpush dx
将余数压入栈cmp al,0
,若al==0,的zf=1jne s1
zf!=0,则跳转到s1,以此实现循环除10,直到商为0,余数入栈or dl 30h
将数字转换为字符对task3.asm源代码进行修改、完善,把task2.asm中用于输出以0结尾的字符串的子程序加进来,
实现对转换后的字符串进行输出。
assume cs:code, ds:data
data segment
x dw 1984
str db 16 dup(0)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, x
mov di, offset str
call num2str
call printStr
mov ah, 4ch
int 21h
num2str:
push ax
push bx
push cx
push dx
mov cx, 0
mov bl, 10
s1:
div bl
inc cx
mov dl, ah
push dx
mov ah, 0
cmp al, 0
jne s1
s2:
pop dx
or dl, 30h
mov [di], dl
inc di
loop s2
pop dx
pop cx
pop bx
pop ax
ret
printStr:
push ax
push bx
push cx
push dx
mov bx, 0b800H
mov es, bx
mov di, 0
mov al,2
mov si,offset str
s: mov cl, [si]
mov ch, 0
jcxz over
mov ch, al
mov es:[di], cx
inc si
add di, 2
jmp s
over: pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
汇编、链接、运行程序,输入一个字符串并以#结束(比如,2020, bye#)观察运行结果。结合运行结
果,理解程序功能,了解软中断指令。
assume cs:code, ds:data
data segment
str db 80 dup(?)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0
s1:
mov ah, 1
int 21h
mov [si], al
cmp al, ‘#‘
je next
inc si
jmp s1
next:
mov cx, si
mov si, 0
s2: mov ah, 2
mov dl, [si]
int 21h
inc si
loop s2
mov ah, 4ch
int 21h
code ends
end start
mov ah,1; int 21h;
从键盘输入,输入结果存入al中cmp al,‘#‘
当al==‘#‘时,zf=1je next
当zf=1时,跳转到next,即输入结束,反正进入下一语句,继续输入mov ah,2; mov dl,[si]; int 21h;
将[si]输出到屏幕在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。代码如下:
#include<stdio.h>
int sum(int, int);
int main() {
int a = 2, b = 7, c;
c = sum(a, b);
return 0;
}
int sum(int x, int y) {
return (x + y);
}
mov dword ptr [c],eax
即说明这一点call
与ret
的结合使用,使用时在函数开始和结尾应当对寄存器数据进行入栈出栈操作,以避免对函数结束后造成影响cmp
和jne
指令的结合使用实现了表示范围内任意数字的输出标签:格式 指示 开始 jmp 执行 包含 中间 一个 调用函数
原文地址:https://www.cnblogs.com/PestLa/p/14130640.html