spdv123 发表于 2016-3-19 08:00

【源码】汇编学习笔记(三)

随手写了一个读入用户输入字符串(以$结尾),程序输出字符串并输出用户输入字符串中字符个数的程序,有一点需要注意就是统计字符串字符个数尽量还是别用dx了,输入输出操作都会覆盖他,20那个数卡了我一会,最后才发现是之前的操作改变了dx导致计数错位。。
stacksegment stack
db 100 dup (?)
stack ends

data segment
xsl db 'Input a string end with dollar char:', 13, 10, '$'
showop db 13, 10, 'Your input string is:$'
showop2 db 13, 10, 'It has $'
showop3 db ' chars.',13, 10, '$'
userstr db 100 dup(0)
data ends

code segment
assume cs:code, ds:data, ss:stack

start:
mov ax, data
mov ds, ax

lea dx, xsl
mov ah, 09h
int 21h

lea si, userstr
mov dx, si
xor dx, dx
callin:
call inputr
inc si
cmp ax, 0
je outp
jmp callin
;采用的计数方法:首先把地址复制到dx,每次读入字符串si偏移量+1,最后si-dx就是读入的字符串长度(+20...)
outp:
lea dx, showop
mov ah, 09h
int 21h
lea dx, userstr
mov ah, 09h
int 21h

lea dx, showop2
mov ah, 09h
int 21h
lea dx, userstr
mov cx, si
sub cx, dx
;sub cx, 20;不减20不对。这里是因为字符串头部还有一些东西?NONONO(因为之前的操作改变了dx)
mov ax, cx
call showint

lea dx, showop3
mov ah, 09h
int 21h

jmp fini

inputr proc
mov ah, 01h
int 21h
mov , al
cmp al, '$'
je ret0
mov ax, 1
ret
ret0:
xor ax, ax
ret
inputr endp

showint proc;显示数字函数
cmp ax, 0;0直接输出
jnz notzero
mov dx, '0'
mov ah, 02h
int 21h
jmp endshow

notzero:
xor cx, cx;cx表示位数,初始为0
pushtostack:
xor dx, dx;被除数是dx和ax的组合。。。不清空会溢出
mov bx, 10
div bx
add dx, '0'
push dx
inc cx
cmp ax, 0
jz popandshow
jmp pushtostack

popandshow:
mov ah, 02h
pop dx
int 21h
loop popandshow

endshow:

ret
showint endp

fini:
mov ah, 01h
int 21h
mov ah, 4ch
int 21h
code ends
end start

spdv123 发表于 2016-3-20 17:07

lovelypiano 发表于 2016-3-19 10:10
弱弱问句,这是什么文本编辑器

editplus 有一个插件

spdv123 发表于 2016-3-19 08:36

music7887 发表于 2016-3-19 08:14
支持一下楼主,很早想学汇编到现在还没下定决心。。。

慢慢来嘛。。。毕竟这个也是循序渐进的,从hello world 开始咯

Bluesky10 发表于 2016-3-19 08:14

分享是一种美德

music7887 发表于 2016-3-19 08:14

支持一下楼主,很早想学汇编到现在还没下定决心。。。

孤独飞天 发表于 2016-3-19 08:53

支持楼主,继续加油哦

292219828 发表于 2016-3-19 09:31

楼主加油,坚持~坚持。

pj_s 发表于 2016-3-19 10:02

看下 多谢分享      

lovelypiano 发表于 2016-3-19 10:10

弱弱问句,这是什么文本编辑器{:1_903:}

Norton 发表于 2016-3-19 11:28

感觉不好学呢
页: [1] 2
查看完整版本: 【源码】汇编学习笔记(三)